home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / MacMarlais 0.5.3 / dylan.dyl < prev    next >
Encoding:
Text File  |  1994-09-19  |  77.0 KB  |  2,622 lines  |  [TEXT/Mrls]

  1. module:        dylan
  2. authors:    Brent Benson
  3.             Joseph N. Wilson (jnw@cis.ufl.edu)
  4.             Patrick C. Beard (beard@cs.ucdavis.edu)
  5. copyright:    Copyright, 1993, Brent Benson.  All Rights Reserved.
  6.             0.4 & 0.5 Revisions Copyright 1994, Joseph N. Wilson.  All Rights Reserved.
  7.  
  8. //
  9. // init.dyl
  10. //
  11. //
  12. // Copyright, 1993, Brent Benson.  All Rights Reserved.
  13. // 0.4 & 0.5 Revisions Copyright 1994, Joseph N. Wilson.  All Rights Reserved.
  14. //
  15. // "Translated" to DIRM syntax by Patrick C. Beard (beard@cs.ucdavis.edu)
  16. //
  17. // Permission to use, copy, and modify this software and its
  18. // documentation is hereby granted only under the following terms and
  19. // conditions.  Both the above copyright notice and this permission
  20. // notice must appear in all copies of the software, derivative works
  21. // or modified version, and both notices must appear in supporting
  22. // documentation.  Users of this software agree to the terms and
  23. // conditions set forth in this notice.
  24. //
  25. // jnw@cis.ufl.edu
  26. // http://www.cis.ufl.edu/~jnw/
  27. //
  28. //
  29.  
  30. //(define-method make ((c <class>) #rest args #key #all-keys)
  31. //  (%make c args))
  32.  
  33. define method make (c :: <class>, #rest args, #key, #all-keys)
  34.     %make(c, args);
  35. end method;
  36.  
  37. // pcb:  what happens to all-keys in old version?
  38.  
  39. // (define instance? (method (obj (t <type>)) (%instance? obj t)))
  40.  
  41. define constant instance? =
  42.     method (obj, typ :: <type>)
  43.         %instance?(obj, typ);
  44.     end;
  45.  
  46. //(define-method as ((c <class>) (obj <object>))
  47. //  (if (object-class obj c)
  48. //      obj
  49. //      (error "No method to coerce ~a to ~a~%" obj c)))
  50.  
  51. define method as (c :: <class>, obj :: <object>)
  52.     if (object-class(obj, c))
  53.         obj;
  54.     else
  55.         error("No method to coerce ~a to ~a~%", obj, c);
  56.     end;
  57. end method;
  58.  
  59. //(define-method as ((kc (singleton <keyword>)) (s <symbol>)) (%symbol->keyword s))
  60. define method as (kc == <keyword>, s :: <symbol>)
  61.     %symbol->keyword(s);
  62. end method;
  63.  
  64. //(define-method as ((sc (singleton <symbol>)) (k <keyword>)) (%keyword->symbol k))
  65. define method as (sc == <symbol>, k :: <keyword>)
  66.     %keyword->symbol(k);
  67. end method;
  68.  
  69. //(define-method as ((sc (singleton <string>)) (s <symbol>)) (%symbol->string s))
  70. define method as (sc == <string>, s :: <symbol>)
  71.     %symbol->string(s);
  72. end method;
  73.  
  74. //(define-method as ((sc (singleton <symbol>)) (s <string>)) (%string->symbol s))
  75. define method as (sc == <symbol>, s :: <string>)
  76.     %string->symbol(s);
  77. end method;
  78.  
  79. // (define-method error ((msg <string>) #rest args) (%apply %error (%pair msg args)))
  80. define method error (msg :: <string>, #rest args)
  81.     %apply(%error, %pair(msg, args));
  82. end method;
  83.  
  84. //(define-method warning ((msg <string>) #rest args) (%apply %warning (%pair msg args)))
  85. define method warning (msg :: <string>, #rest args)
  86.     %apply(%warning, %pair(msg, args));
  87. end method;
  88.  
  89. //(define-method cerror (#rest args)
  90. //  (format #t "cerror: called with arguments ~A" args))
  91. define method cerror (#rest args)
  92.     format(#t, "cerror: called with arguments ~A", args);
  93. end method;
  94.  
  95. //(define-method signal (#rest args)
  96. //  (%signal-error-jump))
  97.  
  98. //(define-method initialize (instance #key #all-keys))
  99. define method initialize (instance, #key, #all-keys)
  100.     warning("default initialize method here");
  101. end method;
  102.  
  103. //
  104. // streams
  105. //
  106.  
  107. //(define-method open-input-file ((s <string>)) (%open-input-file s))
  108. define method open-input-file (s :: <string>) %open-input-file(s); end method;
  109.  
  110. //(define-method open-output-file ((s <string>)) (%open-output-file s))
  111. define method open-output-file (s :: <string>) %open-output-file(s); end method;
  112.  
  113. //(define-method close-stream ((s <stream>)) (%close-stream s))
  114. define method close-stream (s :: <stream>) %close-stream(s); end method;
  115.  
  116. //(define-method eof-object? (obj) (%eof-object? obj))
  117. define method eof-object? (obj) %eof-object?(obj); end method;
  118.  
  119. //(define-method standard-input () (%standard-input))
  120. define method standard-input () %standard-input(); end method;
  121.  
  122. //(define-method standard-output () (%standard-output))
  123. define method standard-output () %standard-output(); end method;
  124.  
  125. //(define-method standard-error () (%standard-error))
  126. define method standard-error () %standard-error(); end method;
  127.  
  128. //(define-method print (obj) (%print obj))
  129. define method print (obj) %print(obj) end method;
  130.  
  131. //(define-method princ (obj) (%princ obj))
  132. define method princ (obj) %princ(obj) end method;
  133.  
  134. //(define-method format (stream (s <string>) #rest args) (%format stream s args))
  135. define method format (stream, s :: <string>, #rest args)
  136.     %format(stream, s, args);
  137. end method;
  138.  
  139. //(define-method write-char ((c <character>) #rest maybe-stream) 
  140. //  (%write-char c maybe-stream))
  141. define method write-char (c :: <character>, #rest maybe-stream)
  142.     %write-char(c, maybe-stream);
  143. end method;
  144.  
  145. //(define-method read (#rest stream)
  146. //  (if (empty? stream)
  147. //      (%read)
  148. //      (%read (head stream))))
  149. define method read (#rest stream)
  150.     if (empty?(stream))
  151.         %read();
  152.     else
  153.         %read(head(stream));
  154.     end if;
  155. end method;
  156.  
  157. //(define-method read-char (#rest stream)
  158. //  (if (empty? stream)
  159. //      (%read-char)
  160. //      (%read-char (head stream))))
  161. define method read-char (#rest stream)
  162.     if (empty?(stream))
  163.         %read-char();
  164.     else
  165.         %read-char(head(stream));
  166.     end if;
  167. end method;
  168.  
  169. //
  170. // functions
  171. //
  172. //(define-method generic-function-methods ((gf <generic-function>)) 
  173. //  (%generic-function-methods gf))
  174. define method generic-function-methods (gf :: <generic-function>)
  175.     %generic-function-methods(gf);
  176. end method;
  177.  
  178. //(define-method add-method ((gf <generic-function>) (method <method>))
  179. //  (%add-method gf method))
  180. define method add-method (gf :: <generic-function>, meth :: <method>)
  181.     %add-method(gf, meth);
  182. end method;
  183.  
  184. //(define-method generic-function-mandatory-keywords ((gf <generic-function>))
  185. //  (%generic-function-mandatory-keywords gf))
  186. define method generic-function-mandatory-keywords (gf :: <generic-function>)
  187.     %generic-function-mandatory-keywords(gf);
  188. end method;
  189.  
  190.  
  191. //(define-method function-specializers ((m <method>)) (%function-specializers m))
  192. define method function-specializers (meth :: <method>)
  193.     %function-specializers(gf, meth);
  194. end method;
  195.  
  196.  
  197. //(define-method method-specializers ((m <method>)) 
  198. //  (warning "method specializers is now function-specializers")
  199. //  (%function-specializers m))
  200.  
  201. //(define-method function-arguments ((f <function>)) (%function-arguments f))
  202. define method function-arguments (f :: <function>)
  203.     %function-arguments(f);
  204. end method;
  205.  
  206. //(define-method applicable-method? ((m <method>) #rest args) 
  207. //  (%apply %applicable-method? (%pair m args)))
  208. define method applicable-method? (m :: <method>, #rest args)
  209.     %apply(%applicable-method?, %pair(m, args));
  210. end method;
  211.  
  212. //(define-method sorted-applicable-methods ((gf <generic-function>) #rest args)
  213. //  (%apply %sorted-applicable-methods (%pair gf args)))
  214. define method sorted-applicable-methods (gf :: <generic-function>, #rest args)
  215.     %apply(%sorted-applicable-methods, %pair(gf, args));
  216. end method;
  217.  
  218.  
  219. //(define-method find-method ((gf <generic-function>) #rest sample-arguments)
  220. //  (%find-method gf sample-arguments))
  221. define method find-method (gf :: <generic-function>, #rest sample-args)
  222.     %find-method(gf, sample-args);
  223. end method;
  224.  
  225. //(define-method remove-method ((gf <generic-function>) (method <method>))
  226. //  (%remove-method gf method))
  227. define method remove-method (gf :: <generic-function>, meth :: <method>)
  228.     %remove-method(gf, meth);
  229. end method;
  230.  
  231. //(define-method make ((gftype (singleton <generic-function>))
  232. //             #key required rest key all-keys)
  233. //  ; if with no else below
  234. //  (and (instance? required <number>)
  235. //       (set! required (make <list>
  236. //                size: required
  237. //                fill: <object>)))
  238. //  (if (instance? required <list>)
  239. //      (%generic-function-make required rest key all-keys)
  240. //      (error "make: bad key value" required: required)))
  241.  
  242. define method make (gftype == <generic-function>, #key required, rest, key, all-keys)
  243.     // if with no else below
  244.     if (instance?(required, <number>))
  245.         required := make(<list>,  size: required, fill: <object>);
  246.     end if;
  247.     if (instance?(required, <list>))
  248.         %generic-function-make(required, rest, key, all-keys);
  249.     else
  250.         error("make: bad key value", required: required);
  251.     end if;
  252. end method;
  253.  
  254. //(define-method debug-name-setter ((m <method>) (s <symbol>)) (%debug-name-setter m s))
  255. define method debug-name-setter (m :: <method>, s :: <symbol>)
  256.     %debug-name-setter(m, s);
  257. end method;
  258.  
  259. //(define-method apply ((f <function>) #rest args)
  260. //  ; pretty kludgy -- hacked in late at night to make apply work for
  261. //  ; arbitrary <sequence> type as last arg. -- jnw
  262. //  (bind-methods ((collect-args (args)
  263. //          (cond
  264. //           ((empty? args) '())
  265. //           ((empty? (tail args)) 
  266. //            (if (not (instance? (head args) <sequence>))
  267. //            (error "apply: last arg must be a sequence" (head args))
  268. //            (head args)))
  269. //           (else:
  270. //            (bind ((res (list)))
  271. //              (for ((state (initial-state args)
  272. //                       (next-state args state)))
  273. //                   ((not state))
  274. //                   (set! res (pair (current-element args state)
  275. //                           res)))
  276. //              (bind ((argseq (head res)))
  277. //                   (set! res (tail res))
  278. //                   (for ((state (initial-state argseq)
  279. //                        (next-state argseq state)))
  280. //                    ((not state) res)
  281. //                    (set! res
  282. //                      (pair (current-element argseq state)
  283. //                        res))))
  284. //              (reverse! res))))))
  285. //        (%apply f (collect-args args))))
  286.  
  287. define method apply (f :: <function>, #rest args)
  288.     // flatten all args into a single list.
  289.     local method collect-args (args)
  290.         case
  291.         empty?(args) => #();
  292.         empty?(tail(args)) =>
  293.             if (~instance?(head(args), <sequence>))
  294.                 error("apply:  last arg must be a sequence", head(args));
  295.             else
  296.                 head(args);
  297.             end if;
  298.         otherwise =>
  299.             let res = #();
  300.             for (state = initial-state(args) then next-state(args, state) until (~state) )
  301.                 res := pair(current-element(args, state), res);
  302.             end for;
  303.             // make sure that last argument is a sequence here.
  304.             if (~instance?(head(res), <sequence>))
  305.                 error("apply:  last arg must be a sequence", head(args));
  306.             end if;
  307.             let argseq = head(res);
  308.             res := tail(res);
  309.             for (state = initial-state(argseq) then next-state(argseq, state) until (~state) )
  310.                 res := pair(current-element(argseq, state), res);
  311.             end for;
  312.             reverse!(res);
  313.         end case;
  314.     end collect-args;
  315.     %apply(f, collect-args(args));
  316. end method;
  317.  
  318. //
  319. // comparisons.
  320. //
  321.  
  322. //
  323. // according to IRM, = should be a generic function so it can be extended
  324. // by user classes. most primitive version just checks if operands are ==.
  325. //
  326.  
  327. //(define-method binary= (obj1 obj2) (id? obj1 obj2))
  328.  
  329. define method \= (o1, o2)
  330.     o1 == o2;
  331. end method;
  332.  
  333. // \~= just calls \= and complements the result.
  334.  
  335. define constant \~= =
  336.     method (o1, o2)
  337.         ~(o1 = o2);
  338.     end;    
  339.  
  340. // IRM definition:  < is a generic function.
  341.  
  342. define method \< (o1, o2)
  343.     error("objects have no intrinsic ordering.");
  344. end;    
  345.  
  346. // >, <=, and >= are all defined by <.
  347.  
  348. define constant \> =
  349.     method (o1, o2)
  350.         o2 < o1;
  351.     end;
  352.  
  353. define constant \<= =
  354.     method (o1, o2)
  355.         ~(o2 < o1);
  356.     end;
  357.  
  358. define constant \>= =
  359.     method (o1, o2)
  360.         ~(o1 < o2);
  361.     end;
  362.  
  363. //(define-method =hash (obj) (%=hash obj))
  364.  
  365. define method =hash (obj)
  366.     %=hash(obj);
  367. end method;
  368.  
  369. //
  370. // classes
  371. //
  372.  
  373. //(define subtype? (method ((t1 <type>) (t2 <type>))
  374. //             (%subtype? t1 t2)))
  375.  
  376. define constant subtype? =
  377.     method (t1 :: <type>, t2 :: <type>)
  378.         %subtype?(t1, t2);
  379.     end;
  380.  
  381. //(define subclass?
  382. //  (method (c1 c2)
  383. //      (princ "warning: subclass is deprecated by Dylan Design Note 5.")
  384. //      (%subtype? c1 c2)))
  385.  
  386. //(define all-superclasses (method ((c <class>))
  387. //                 (%all-superclasses c)))
  388. define constant all-superclasses = 
  389.     method (c :: <class>)
  390.         %all-superclasses(c);
  391.     end;
  392.  
  393. //(define direct-superclasses (method ((c <class>))
  394. //                    (%direct-superclasses c)))
  395. define constant direct-superclasses =
  396.     method (c :: <class>)
  397.         %direct-superclasses(c);
  398.     end;
  399.  
  400. //(define direct-subclasses (method ((c <class>))
  401. //                  (%direct-subclasses c)))
  402. define constant direct-subclasses =
  403.     method (c :: <class>)
  404.         %direct-subclasses(c);
  405.     end;
  406.  
  407. //(define-method seal ((c <class>))
  408. //  (%seal c))
  409. define method seal (c :: <class>)
  410.     %seal(c);
  411. end method;
  412.  
  413. //(define slot-initialized?
  414. //  (method (obj slot)
  415. //      (not (id? (slot obj) %uninitialized-slot-value))))
  416. define constant slot-initialized? = 
  417.     method (obj, slot)
  418.         ~(id? (slot(obj), %uninitialized-slot-value));
  419.     end;
  420.  
  421. //
  422. // types
  423. //
  424. // We need to leave this out for now because we haven't thought about
  425. // how to compare limited types in sorting applicable gf methods.
  426.  
  427. // limited <integer>
  428.  
  429. //(define-method limited ((int (singleton <integer>))
  430. //            #rest args
  431. //                #key min max)
  432. //  (%limited-integer args))
  433.  
  434. // 24 May 1994
  435. // limited <collection>
  436.  
  437. //;(define-method limited ((coll (singleton <collection>))
  438. //;            #rest args
  439. //;            #key
  440. //;            (of <type>)
  441. //;            (size (limited <integer> min: 0)))
  442. //;  (if (and (not (sealed? coll)) (instantiable? coll))
  443. //;      (%limited-collection args)
  444. //;      (error "limited: collection either sealed or not instantiable:" coll)))
  445.  
  446.  
  447. // union types
  448. //(define-method union ((t1 <type>) (t2 <type>))
  449. //  (%union-type (list t1 t2)))
  450. define method union (t1 :: <type>, t2 :: <type>)
  451.     %union-type(list(t1, t2));
  452. end method;
  453.  
  454. //(define-method union* (#rest args)
  455. //  (union (first args) (apply union (tail args))));
  456. define method union* (#rest args)
  457.     union(head(args), apply(union, tail(args)));
  458. end method;
  459.  
  460. //
  461. // collections
  462. //
  463.  
  464. //
  465. // collection.dyl - portable collection functions
  466. //
  467. // Brent Benson
  468. //
  469.  
  470. //
  471. // collections
  472. //
  473. // (size collection) => integer or #f
  474. // (class-for-copy collection) => class
  475. // (empty? collection) => boolean
  476. // (do procedure collection #rest more-collections) => #f
  477. // (map procedure collection #rest more-collections) => new-collection
  478. // (map-as class procedure collection #rest more-collections) => new-collection
  479. // (map-into mutable-col procedure collection #rest more-cols) => mutable-col
  480. // (any? procedure collection #rest more-collections) => value
  481. // (every? procedure collection #rest more-collections) => boolean
  482. // (reduce procedure initial-value collection) => value
  483. // (reduce1 procedure collection) => value
  484. // (member? value collection #key test) => boolean
  485. // (find-key collection procedure #key skip failure) => key
  486. // (replace-elements! mutable-col predicate new-value-fn #key count) => mutable-col
  487. // (fill! mutable-collection value #key start end)
  488.  
  489. //(define-generic-function element ((c <collection>) key #rest rest))
  490. define generic element (c :: <collection>, key, #rest rest);
  491.  
  492. //(define-method size ((c <collection>))
  493. //  (for ((state (initial-state c) (next-state c state))
  494. //    (the-size 0 (+ the-size 1)))
  495. //       ((not state) the-size)))
  496.  
  497. define method size (c :: <collection>)
  498.     let the-size = 0;
  499.     for (state = initial-state(c) then next-state(c, state) until (~state))
  500.         the-size := the-size + 1;
  501.     finally
  502.         the-size;
  503.     end for;
  504. end method;
  505.  
  506. //(define-method class-for-copy ((c <collection>))
  507. //  (object-class c))
  508.  
  509. define method class-for-copy (c :: <collection>)
  510.     object-class(c);
  511. end method;
  512.  
  513. //
  514. // Added to satisfy implementation of every? below
  515. //
  516.  
  517. //(define-method class-for-copy ((p <pair>))
  518. //  <list>)
  519.  
  520. define method class-for-copy (p :: <pair>)
  521.     <list>;
  522. end method;
  523.  
  524. //(define-method class-for-copy ((b <byte-string>)) <byte-string>)
  525.  
  526. define method class-for-copy (p :: <byte-string>)
  527.     <byte-string>;
  528. end method;
  529.  
  530. //(define-method empty? ((c <collection>))
  531. //  (if (initial-state c)
  532. //      #f
  533. //      #t))
  534.  
  535. define method empty? (c :: <collection>)
  536.     if (initial-state(c))
  537.         #f;
  538.     else
  539.         #t;
  540.     end if;
  541. end method;
  542.  
  543. // map1 and map2 aren't part of the spec, but are included here
  544. // for bootstrapping purposes.
  545. //
  546. //(define-method map1 ((f <function>) (c <collection>))
  547. //  (bind ((class (class-for-copy c))
  548. //     (new (make class size: (size c))))
  549. //    (for ((state (initial-state c) (next-state c state))
  550. //      (i 0 (+ i 1)))
  551. //    ((not state) new)
  552. //      (set! (element new i) (f (current-element c state))))))
  553.  
  554. define method map1 (f :: <function>, c :: <collection>)
  555.     let cl = class-for-copy(c);
  556.     let new = make(class, size: size(c));
  557.     let index = 0;
  558.     for (state = initial-state(c) then next-state(c, state) until (~state))
  559.         new[index] := f(c[index]);
  560.         index := index + 1;
  561.     finally
  562.         new;
  563.     end for;
  564. end method;
  565.  
  566. //(define-method map2 ((f <function>) (c1 <collection>) (c2 <collection>))
  567. //  (bind ((class (class-for-copy c1))
  568. //     (new (make class size: (size c1))))
  569. //    (for ((state1 (initial-state c1) (next-state c1 state1))
  570. //      (state2 (initial-state c2) (next-state c2 state2))
  571. //      (i 0 (+ i 1)))
  572. //    ((not state1) new)
  573. //      (set! (element new i) (f (current-element c1 state1)
  574. //                   (current-element c2 state2))))))
  575.  
  576. define method map2 (f :: <function>, c1 :: <collection>, c2 :: <collection>)
  577.     let cl = class-for-copy(c1);
  578.     let new = make(class, size: size(c1));
  579.     let index = 0;
  580.     for (st1 = initial-state(c1) then next-state(c1, st1),
  581.         st2 = initial-state(c2) then next-state(c2, st2)
  582.         until (~st1))
  583.         new[index] := f(c1[index], c2[index]);
  584.         index := index + 1;
  585.     finally
  586.         new;
  587.     end for;
  588. end method;
  589.  
  590. //(define-method do ((f <function>) (c <collection>) #rest more-collections)
  591. //  (bind ((collections (pair c more-collections)))
  592. //    (for ((states (map1 initial-state collections)
  593. //              (map2 next-state collections states)))
  594. //         ((not (head states)) #f)
  595. //    (apply f (map2 current-element collections states)))))
  596.  
  597. define method do (f :: <function>, c :: <collection>, #rest more-collections)
  598.     let collections = pair(c, more-collections);
  599.     for (states = map1(initial-state, collections)
  600.         then     map2(next-state, collections, states) until (~head(states)))
  601.         apply(f, map2(current-element, collections, states));
  602.     finally
  603.         #f;
  604.     end for;
  605. end method;
  606.  
  607. //(define-method map ((f <function>) (c <collection>) #rest more-collections)
  608. //  (bind ((collections (pair c more-collections))
  609. //     (class (class-for-copy c))
  610. //     (new (make class size: (size c))))
  611. //    (for ((states (map1 initial-state collections)
  612. //          (map2 next-state collections states))
  613. //      (i 0 (+ i 1)))
  614. //    ((not (head states)) new)
  615. //      (set! (element new i) (apply f (map2 current-element collections states))))))
  616.  
  617. //(define-method map-as ((class <class>) (f <function>) (c <collection>) #rest more-collections)
  618. //  (bind ((collections (pair c more-collections))
  619. //     (new (make class size: (size c))))
  620. //    (for ((states (map1 initial-state collections)
  621. //          (map2 next-state collections states))
  622. //      (i 0 (+ i 1)))
  623. //    ((not (head states)) new)
  624. //      (set! (element new i) (apply f (map2 current-element collections states))))))
  625.  
  626. //(define-method map-into ((mc <mutable-collection>) (f <function>) #rest more-collections)
  627. //  (bind ((collections (pair mc more-collections)))
  628. //    (for ((states (map1 initial-state collections)
  629. //          (map2 next-state collections states))
  630. //      (i 0 (+ i 1)))
  631. //    ((not (head states)) mc)
  632. //      (set! (element mc i) (apply f (map2 current-element collections states))))))
  633.  
  634. //(define-method any? ((f <function>) (c <collection>) #rest more-collections)
  635. //  (bind ((collections (pair c more-collections))
  636. //     (ret #f))
  637. //    (for ((states (map1 initial-state collections)
  638. //          (map2 next-state collections states))
  639. //      (i 0 (+ i 1)))
  640. //    ((or (not (head states)) ret) ret)
  641. //      (set! ret (apply f (map2 current-element collections states))))))
  642.  
  643. //(define-method every? ((f <function>) (c <collection>) #rest more-collections)
  644. //  (bind ((collections (pair c more-collections))
  645. //     (ret #t))
  646. //    (for ((states (map1 initial-state collections)
  647. //          (map2 next-state collections states))
  648. //      (i 0 (+ i 1)))
  649. //    ((or (not (head states)) (not ret)) ret)
  650. //      (set! ret (apply f (map2 current-element collections states))))))
  651.  
  652. //(define-method reduce ((f <function>) init-value (c <collection>))
  653. //  (bind ((value init-value))
  654. //    (for ((state (initial-state c) (next-state c state)))
  655. //    ((not state) value)
  656. //      (set! value (f value (current-element c state))))))
  657.  
  658. define method reduce (f :: <function>, init-value, c :: <collection>)
  659.     let value = init-value;
  660.     for (state = initial-state(c) then next-state(c, state) until (~state))
  661.         value := f(value, current-element(c, state));
  662.     finally
  663.         value;
  664.     end for;
  665. end method;
  666.  
  667. //(define-method reduce1 ((f <function>) (c <collection>))
  668. //  (bind ((first-state (initial-state c))
  669. //     (value (current-element c first-state)))
  670. //    (for ((state (next-state c first-state) (next-state c state)))
  671. //    ((not state) value)
  672. //      (set! value (f value (current-element c state))))))
  673.  
  674. define method reduce1 (f :: <function>, c :: <collection>)
  675.     let first-state = initial-state(c);
  676.     let value = current-element(c, first-state);
  677.     for (state = next-state(c, first-state) then next-state(c, state) until (~state))
  678.         value := f(value, current-element(c, state));
  679.     finally
  680.         value;
  681.     end for;
  682. end method;
  683.  
  684. // for example:
  685. // define method sum (l :: <list>) reduce1(\+, l); end method;
  686. // sum(#(1,2,3) --> 6
  687.  
  688. //(define-method member? (value (c <collection>) #key (test id?))
  689. //  (bind ((ret #f))
  690. //    (for ((state (initial-state c) (next-state c state)))
  691. //    ((or (not state) ret) ret)
  692. //      (set! ret (test (current-element c state) value)))))
  693.  
  694. define method member? (value, c :: <collection>, #key test (id?))
  695.     let ret = #f;
  696.     for (state = initial-state(c) then next-state(c, state) until (~state | ret))
  697.         ret := test(current-element(c, state), value);
  698.     finally
  699.         ret;
  700.     end for;
  701. end method;
  702.  
  703. //(define-method find-key ((c <collection>) (f <function>) #key (skip 0) (failure #f))
  704. //  (bind ((keys (key-sequence c)))
  705. //    (bind-exit (exit)
  706. //      (for ((state (initial-state keys) (next-state keys state))
  707. //        (i 0 (+ i 1)))
  708. //      ((not state) failure)
  709. //    (when (>= i skip)
  710. //      (bind ((cur (current-element keys state)))
  711. //        (when (f (element c cur))
  712. //          (exit cur))))))))
  713.  
  714. //(define-method replace-elements! ((mc <mutable-collection>) 
  715. //                  (pred <function>)
  716. //                  (new-value-fn <function>)
  717. //                  #key (count #f))
  718. //  (for ((state (initial-state mc) (next-state mc state))
  719. //    (cur-count 0 (+ cur-count 1)))
  720. //      ((or (not state) (> cur-count count)) mc)
  721. //    (if (pred (current-element mc state))
  722. //    (set! (current-element mc state) (new-value fn (current-element mc state))))))
  723.  
  724. //(define-method fill! ((mc <mutable-collection>) value)
  725. //  (for ((state (initial-state mc) (next-state mc state)))
  726. //      ((not state) mc)
  727. //    (print value)
  728. //    (set! (current-element mc state) value)))
  729.  
  730. //(define-method fill! ((ms <mutable-sequence>) value #key (start 0) (end (size ms)))
  731. //  (for ((i start (+ i 1)))
  732. //      ((>= i end) ms)
  733. //    (set! (element ms i) value)))
  734.  
  735. define method fill! (ms :: <mutable-sequence>, value, #key start (0), finish (size(ms)))
  736.     for (i :: <integer> from start to finish)
  737.         ms[i] := value;
  738.     finally
  739.         ms;
  740.     end for;
  741. end method;
  742.  
  743. //
  744. // sequences
  745. //
  746. // (add sequence new-element) => new-sequence
  747. // (add! sequence1 new-element) => sequence2
  748. // (add-new sequence new-element #key test) => new-sequence
  749. // (add-new! sequence1 new-element #key test) => sequence2
  750. // (remove sequence value #key test count) => new-sequence
  751. // (remove! sequence1 value #key test count) => sequence2
  752. // (choose predicate sequence) => new-sequence
  753. // (choose-by predicate test-sequence value-sequence) => new-sequence
  754. // (intersection sequence1 sequence2 #key test) => new-sequence
  755. // (union sequence1 sequence2 #key test) => new-sequence
  756. // (remove-duplicates sequence #key test) => new-sequence
  757. // (remove-duplicates! sequence1 #key test) => sequence2
  758. // (copy-sequence source #key start end) => new-sequence
  759. // (concatenate-as class sequence1 #rest more-sequences) => new-sequence
  760. // (concatenate sequence1 #rest sequences) => new-sequence
  761. // (replace-subsequence! mutable-sequence insert-sequence #key start) => sequence
  762. // (reverse sequence) => new-sequence
  763. // (reverse! sequence1) => sequence2
  764. // (sort sequence #key test stable) => new-sequence
  765. // (sort! sequence1 #key test stable) => sequence2
  766. // (first sequence) => value
  767. // (second sequence) => value
  768. // (third sequence) => value
  769. // (first-setter sequence new-value) => new-value
  770. // (second-setter sequence new-value) => new-value
  771. // (third-setter sequence new-value) => new-value
  772. // (last sequence) => value
  773. // (subsequence-position big pattern #key test count) => index
  774. //
  775. // others
  776.  
  777. //(define-method add ((s <sequence>) new-el)
  778. //  (bind ((class (class-for-copy s))
  779. //     (new (make class size: (+ (size s) 1))))
  780. //    (for ((state1 (initial-state s) (if state1 (next-state s state1) #f))
  781. //      (state2 (initial-state new) (next-state new state2)))
  782. //    ((not state2) new)
  783. //      (if state1
  784. //      (set! (current-element new state2) (current-element s state1))
  785. //      (set! (current-element new state2) new-el)))))
  786.  
  787. //(define-method add! ((s <sequence>) new-el)
  788. //  (bind ((class (class-for-copy s))
  789. //     (new (make class size: (+ (size s) 1))))
  790. //    (for ((state1 (initial-state s) (if state1 (next-state s state1) #f))
  791. //      (state2 (initial-state new) (next-state new state2)))
  792. //    ((not state2) new)
  793. //      (if state1
  794. //      (set! (current-element new state2) (current-element s state1))
  795. //      (set! (current-element new state2) new-el)))))
  796.  
  797. //(define-method add-new ((s <sequence>) new-el #key (test id?))
  798. //  (if (member? new-el s test: test)
  799. //      s
  800. //      (add s new-el)))
  801.  
  802. //(define-method add-new! ((s <sequence>) new-el #key (test id?))
  803. //  (if (member? new-el s test: test)
  804. //      s
  805. //      (add! s new-el)))
  806.  
  807. //(define-method remove ((s <sequence>) value #key (test id?) count)
  808. //  (bind-methods ((new-as-list (s state cur-count)
  809. //           (cond
  810. //            ((not state) '())
  811. //            ((and count (>= cur-count count))
  812. //             (pair (current-element s state) 
  813. //               (new-as-list s (next-state s state) cur-count)))
  814. //            ((test (current-element s state) value)
  815. //             (new-as-list s (next-state s state) (+ cur-count 1)))
  816. //            (else:
  817. //             (pair (current-element s state) 
  818. //               (new-as-list s (next-state s state) cur-count))))))
  819. //    (bind ((class (class-for-copy s))
  820. //       (new-list (new-as-list s (initial-state s) 0)))
  821. //      (as class new-list))))
  822.  
  823. //(define-method remove! ((s <sequence>) value #key (test id?) count)
  824. //  (bind-methods ((new-as-list (s state cur-count)
  825. //           (cond
  826. //            ((not state) '())
  827. //            ((and count (>= cur-count count))
  828. //             (pair (current-element s state) 
  829. //               (new-as-list s (next-state s state) cur-count)))
  830. //            ((test (current-element s state) value)
  831. //             (new-as-list s (next-state s state) (+ cur-count 1)))
  832. //            (else:
  833. //             (pair (current-element s state) 
  834. //               (new-as-list s (next-state s state) cur-count))))))
  835. //    (bind ((class (class-for-copy s))
  836. //       (new-list (new-as-list s (initial-state s) 0)))
  837. //      (as class new-list))))
  838.  
  839. //(define-method choose ((pred <function>) (s <sequence>))
  840. //  (bind-methods ((new-as-list (s state)
  841. //                  (cond
  842. //           ((not state) '())
  843. //           ((pred (current-element s state))
  844. //            (pair (current-element s state)
  845. //              (new-as-list s (next-state s state))))
  846. //           (else: (new-as-list s (next-state s state))))))
  847. //    (bind ((class (class-for-copy s))
  848. //       (new-list (new-as-list s (initial-state s))))
  849. //      (as class new-list))))
  850.  
  851. //(define-method choose-by ((pred <function>) (ts <sequence>) (vs <sequence>))
  852. //  (bind-methods ((new-as-list (ts ts-state vs vs-state)
  853. //                  (cond
  854. //           ((not state1) '())
  855. //           ((pred (current-element ts ts-state))
  856. //            (pair (current-element vs vs-state)
  857. //              (new-as-list ts (next-state ts ts-state)
  858. //                       vs (next-state vs vs-state))))
  859. //           (else: (new-as-list ts (next-state ts ts-state)
  860. //                       vs (next-state vs vs-state))))))
  861. //    (bind ((class (class-for-copy s))
  862. //       (new-list (new-as-list ts (initial-state ts)
  863. //                  vs (initial-state vs))))
  864. //      (as class new-list))))
  865.  
  866. //(define-method intersection ((s1 <sequence>) (s2 <sequence>) #key (test id?))
  867. //  (bind ((new-list '())
  868. //     (class (class-for-copy s1)))
  869. //    (for ((state1 (initial-state s1) (next-state s1 state1)))
  870. //    ((not state1))
  871. //      (bind ((el (current-element s1 state1)))
  872. //    (when (member? el s2 test: test)
  873. //       (set! new-list (pair el new-list)))))
  874. //    (as class new-list)))
  875.  
  876. //(define-method union ((s1 <sequence>) (s2 <sequence>) #key (test id?))
  877. //  (bind ((new (copy-sequence s2)))
  878. //    (for ((state1 (initial-state s1) (next-state s1 state1)))
  879. //    ((not state1) new)
  880. //      (set! new (add-new! new (current-element s1 state1) test: test)))))
  881.                   
  882. //(define-method remove-duplicates ((s <sequence>) #key (test id?))
  883. //  (bind ((new-list '()))
  884. //    (for ((state1 (initial-state s) (next-state s state1)))
  885. //    ((not state1))
  886. //      (bind ((already-there #f))
  887. //    (for ((state2 (initial-state s) (next-state s state2)))
  888. //        ((or already-there (not state)))
  889. //      (if (test (current-element s state1) (current-element s state2))
  890. //          (set! already-there #t)))
  891. //    (if (not already-there)
  892. //        (set! new-list (pair (current-element s state1))))))
  893. //    (as (class-for-copy s) new-list)))
  894.  
  895. //(define-method remove-duplicates! ((s <sequence>) #key (test id?))
  896. //  (bind ((new-list '()))
  897. //    (for ((state1 (initial-state s) (next-state s state1)))
  898. //    ((not state1))
  899. //      (bind ((already-there #f))
  900. //    (for ((state2 (initial-state s) (next-state s state2)))
  901. //        ((or already-there (not state)))
  902. //      (if (test (current-element s state1) (current-element s state2))
  903. //          (set! already-there #t)))
  904. //    (if (not already-there)
  905. //        (set! new-list (pair (current-element s state1))))))
  906. //    (as (class-for-copy s) new-list)))
  907.  
  908. //(define-method copy-sequence ((s <sequence>) #key (start 0) (end (size s)))
  909. //  (bind ((new (make (class-for-copy s) size: (- end start))))
  910. //    (for ((state1 (initial-state s) (next-state s state1))
  911. //      (state2 (initial-state new) (next-state new state2)))
  912. //    ((not state1) new)
  913. //      (set! (current-element new state2) (current-element s state1)))))
  914.  
  915. //(define-method concatenate-as ((class <class>) (s <sequence>) #rest more-seq)
  916. //  (bind ((new (apply concatenate s more-seq)))
  917. //    (as class new)))
  918.  
  919. //(define-method concatenate ((s <sequence>) #rest more-seq)
  920. //  (bind-methods ((help (s more)
  921. //          (if (empty? more)
  922. //              s
  923. //              (help (concatenate2 s (head more))
  924. //                (tail more))))
  925. //         (concatenate2 ((s1 <sequence>) (s2 <sequence>))
  926. //                  (bind ((size1 (size s1))
  927. //             (size2 (size s2))
  928. //             (new-size (+ size1 size2))
  929. //             (new (make (class-for-copy s1) size: new-size)))
  930. //            (for ((i 0 (+ i 1)))
  931. //            ((>= i new-size) new)
  932. //              (if (< i size1)
  933. //              (set! (element new i) (element s1 i))
  934. //              (set! (element new i) (element s2 (- i size1))))))))
  935. //    (help s more-seq)))
  936.  
  937. //(define-method replace-subsequence! ((ms <mutable-sequence>) 
  938. //                     (is <sequence>) 
  939. //                     #key (start 0))
  940. //  (for ((i 0 (+ i 1)))
  941. //      ((>= i (size is)) ms)
  942. //    (set! (element ms (+ i start)) (element is i))))
  943.  
  944. //(define-method reverse ((s <sequence>))
  945. //  (bind ((seq-size (size s))
  946. //     (new (make (class-for-copy s) size: seq-size)))
  947. //    (for ((i 0 (+ i 1)))
  948. //    ((>= i seq-size) new)
  949. //      (set! (element new i) (element s (- seq-size i 1))))))
  950.  
  951. //
  952. // check me
  953. //
  954.  
  955. //(define-method reverse! ((s <sequence>))
  956. //  (bind ((seq-size (size s))
  957. //     (seq-size/2 (/ seq-size 2)))
  958. //    (for ((i 0 (+ i 1)))
  959. //    ((>= i seq-size/2) s)
  960. //      (bind ((temp (element s i))
  961. //         (j (- seq-size i 1)))
  962. //    (element-setter s i (element s j))
  963. //    (element-setter s j temp)))))
  964.  
  965. //(define-method sort ((s <sequence>) #key (test <) (stable #t))
  966. //  (if (not stable)
  967. //      (error "sort: cannot sort a non-stable sequence" s)
  968. //      (sort! (copy-sequence s) test: test stable: stable)))
  969.  
  970. define method sort (s :: <sequence>, #key test (\<), stable (#t))
  971.     if (~stable)
  972.         error("sort: cannot sort a non-stable sequence", s);
  973.     else
  974.         sort!(copy-sequence(s), test: test, stable: stable);
  975.     end if;
  976. end method;
  977.  
  978. //(define-method sort! ((s <sequence>) #key (test <) (stable #t))
  979. //  (if (not stable)
  980. //      (error "sort!: cannot sort a non-stable sequence" s)
  981. //      (error "sort!: unimplemented" s)))
  982.  
  983. define method sort! (s :: <sequence>, #key test (\<), stable (#t))
  984.     if (~stable)
  985.         error("sort: cannot sort a non-stable sequence", s);
  986.     else
  987.         error("sort!: unimplemented", s);
  988.     end if;
  989. end method;
  990.  
  991. //(define-method first ((s <sequence>) #key (default %default-object))
  992. //  (element s 0 default: default))
  993. //(define-method second ((s <sequence>) #key (default %default-object))
  994. //  (element s 1 default: default))
  995. //(define-method third ((s <sequence>) #key (default %default-object))
  996. //  (element s 2 default: default))
  997.  
  998. define method first (s :: <sequence>, #key default (%default-object))
  999.     element(s, 0, default: default);
  1000. end method;
  1001. define method second (s :: <sequence>, #key default (%default-object))
  1002.     element(s, 1, default: default);
  1003. end method;
  1004. define method third (s :: <sequence>, #key default (%default-object))
  1005.     element(s, 2, default: default);
  1006. end method;
  1007.  
  1008. //(define-method first-setter ((s <sequence>) el) (set! (element s 0) el))
  1009. //(define-method second-setter ((s <sequence>) el) (set! (element s 1) el))
  1010. //(define-method third-setter ((s <sequence>) el) (set! (element s 2) el))
  1011.  
  1012. define method first-setter (s :: <sequence>, el) s[0] := el; end method;
  1013. define method second-setter (s :: <sequence>, el) s[1] := el; end method;
  1014. define method third-setter (s :: <sequence>, el) s[2] := el; end method;
  1015.  
  1016. //(define-method last ((s <sequence>) #key (default %default-object))
  1017. //  (bind ((size (size s)))
  1018. //    (case size
  1019. //      ((0 #f) (if (id? default %default-object)
  1020. //              (if (= size 0)
  1021. //              (error "last applied to empty sequence")
  1022. //              (error "last applied to unbounded sequence"))
  1023. //              default))
  1024. //      (else: (element s (- size 1))))))
  1025.  
  1026. define method last (s :: <sequence>, #key default (%default-object))
  1027.     let sz = size(s);
  1028.     if (sz = 0 | sz = #f)
  1029.         if (id?(default, %default-object))
  1030.             if (sz = 0)
  1031.                 error("last applied to empty sequence");
  1032.             else
  1033.                 error("last applied to unbounded sequence");
  1034.             end if;
  1035.         else
  1036.             default;
  1037.         end if;
  1038.     else
  1039.         s[sz - 1];
  1040.     end if;
  1041. end method;
  1042.  
  1043. //(define-method last-setter ((s <sequence>) new-value)
  1044. //  (bind ((size (size s)))
  1045. //    (case size
  1046. //      ((0) (error "last-setter applied to empty sequence"))
  1047. //      ((#f) (error "last-setter applied to unbounded sequence"))
  1048. //      (else: (element-setter s (- size 1) new-value)))))
  1049.  
  1050. define method last-setter (s :: <sequence>, new-value)
  1051.     let sz = size(s);
  1052.     if (sz = 0)
  1053.         error("last-setter applied to empty sequence");
  1054.     else
  1055.         if (~sz)
  1056.             error("last-setter applied to unbounded sequence");
  1057.         else
  1058.             s[sz - 1] := new-value;
  1059.         end if;
  1060.     end if;
  1061. end method;
  1062.  
  1063. //(define-method subsequence-position (bit pattern #key (test id?) count) 'unimplemented)
  1064.  
  1065. //
  1066. // convert from one collection type to another
  1067. //
  1068. //(define-method as ((new-class <class>) (c <collection>))
  1069. //  (if (instance? c new-class)
  1070. //      c
  1071. //      (bind ((new (make new-class size: (size c))))
  1072. //    (for ((state1 (initial-state c) (next-state c state1))
  1073. //          (state2 (initial-state new) (next-state new state2)))
  1074. //       ((not state1) new)
  1075. //     (set! (current-element new state2) (current-element c state1))))))
  1076.  
  1077. //(define-method key-sequence ((s <sequence>))
  1078. //  (bind ((res '()))
  1079. //    (for ((state (initial-state s) (next-state s state))
  1080. //      (i 0 (+ i 1)))
  1081. //    ((not state) res)
  1082. //      (set! res (pair i res)))))
  1083.  
  1084. //(define-method binary= ((s1 <sequence>) (s2 <sequence>))
  1085. //   (for ((state1 (initial-state s1) (next-state s1 state1))
  1086. //     (state2 (initial-state s2) (next-state s2 state2)))
  1087. //    ((if (not state1)
  1088. //         #t
  1089. //         (not (binary= (current-element s1 state1)
  1090. //               (current-element s2 state2))))
  1091. //     (and (not state1) (not state2)))))
  1092.  
  1093. // end collection.dyl
  1094.  
  1095. //
  1096. // list.dyl - list operations
  1097. //
  1098. // Brent Benson
  1099. //
  1100.  
  1101. //
  1102. // list specific operations
  1103. //
  1104.  
  1105. //(define-method pair (car cdr) (%pair car cdr))
  1106. define method pair (car, cdr) %pair(car, cdr); end method;
  1107.  
  1108. //(define-method list (#rest els) els)
  1109. define method list (#rest els) els end method;
  1110.  
  1111. //(define-method head ((p <pair>)) (%head p))
  1112. define method head (p :: <pair>) %head(p); end method;
  1113.  
  1114. //(define-method tail ((p <pair>)) (%tail p))
  1115. define method tail (p :: <pair>) %tail(p); end method;
  1116.  
  1117. //(define-method head-setter ((p <pair>) obj) (%head-setter p obj))
  1118. define method head-setter (p :: <pair>, obj)
  1119.     %head-setter(p, obj);
  1120. end method;
  1121.  
  1122. //(define-method tail-setter ((p <pair>) obj) (%tail-setter p obj))
  1123. define method tail-setter (p :: <pair>, obj)
  1124.     %tail-setter(p, obj);
  1125. end method;
  1126.  
  1127. //
  1128. // synonyms for lisp hackers -- deprecated!
  1129. //
  1130. //(define-method car ((p <pair>))
  1131. //  (princ "warning: car is deprecated by Dylan Design Note 16.")
  1132. //  (%head p))
  1133. //(define-method cdr ((p <pair>))
  1134. //  (princ "warning: cdr is deprecated by Dylan Design Note 16.")
  1135. //  (%tail p))
  1136. //(define-method cons (car cdr)
  1137. //  (princ "warning: cons is deprecated by Dylan Design Note 16.")
  1138. //  (%pair car cdr))
  1139.  
  1140. //
  1141. // generic sequence operations
  1142. //
  1143.  
  1144. //(define-method add ((l <list>) el) (pair el (copy-sequence l)))
  1145. //(define-method add! ((l <list>) el) (pair el l))
  1146.  
  1147. define method add(l :: <list>, el)
  1148.     pair(el, copy-sequence(l));     // can't share structure.
  1149. end method;
  1150. define method add!(l :: <list>, el) pair(el, l); end method;
  1151.  
  1152. //(define-method add-new ((l <list>) el #key (test id?))
  1153. //  (if (not (member? el l test: test))
  1154. //      (add l el)
  1155. //      l))
  1156.  
  1157. //(define-method add-new! ((l <list>) el #key (test id?))
  1158. //  (if (not (member? el l test: test))
  1159. //      (add! l el)
  1160. //      l))
  1161.  
  1162. //(define-method remove ((l <list>) el #key (test id?) (count #f))
  1163. //  (bind-methods ((help (l el c)
  1164. //           (cond
  1165. //            ((empty? l) l)
  1166. //            ((test (head l) el) (if (and count (>= c count))
  1167. //                        (copy-sequence l)
  1168. //                        (help (tail l) el (+ c 1))))
  1169. //            (else: (pair (head l) (help (tail l) el c))))))
  1170. //    (help l el 0)))
  1171.  
  1172. //(define-method remove! ((orig <list>) el #key (test id?) (count #f))
  1173. //  (bind-methods ((help (lst last c)
  1174. //               (cond
  1175. //            ((empty? lst) '())
  1176. //            ((test (head l) el) (if (and count (>= c count))
  1177. //                        lst
  1178. //                        (help (tail lst) (head lst) (+ c 1))))
  1179. //            (else: ))))))  
  1180.  
  1181. //(define-method choose ((pred <function>) (l <list>))
  1182. //  (cond
  1183. //   ((empty? l) l)
  1184. //   ((pred (head l)) (pair (head l) (choose pred (tail l))))
  1185. //   (else: (choose pred (tail l)))))
  1186.  
  1187. //(define-method choose-by ((pred <function>) (test-list <list>) (value-list <list>))
  1188. //  (cond
  1189. //   ((and (empty? test-list) (empty? value-list)) '())
  1190. //   ((or (empty? test-list) (empty? value-list))
  1191. //    (error "choose-by: test list and value list have different sizes" test-list value-list))
  1192. //   ((pred (head test-list)) (pair (head value-list) 
  1193. //                  (choose-by pred (tail test-list) (tail value-list))))
  1194. //   (else: (choose-by pred (tail test-list) (tail value-list)))))
  1195.  
  1196. //(define-method intersection ((l1 <list>) (l2 <list>) #key (test id?))
  1197. //  (bind ((res '()))
  1198. //    (for ((state (initial-state l1) (next-state l1 state)))
  1199. //      ((not state) res)
  1200. //      (bind ((cur (current-element l1 state)))
  1201. //    (when (member? cur l2 test: test)
  1202. //      (set! res (pair cur res)))))))
  1203.  
  1204. //(define-method union ((l1 <list>) (l2 <list>) #key (test id?))
  1205. //  (for ((state (initial-state l1) (next-state l1 state)))
  1206. //      ((not state) l2)
  1207. //    (set! l2 (add-new! l2 (current-element l1 state) test: test))))
  1208.  
  1209. //(define-method remove-duplicates ((l <list>) #key (test id?))
  1210. //  (bind-methods ((help (l)
  1211. //                   (cond
  1212. //            ((empty? l) '())
  1213. //            ((member? (head l) (tail l) test: id?)
  1214. //             (help (tail l)))
  1215. //            (else: (pair (head l) (help (tail l)))))))
  1216. //    (help l)))
  1217.  
  1218. //(define-method remove-duplicates! ((l <list>) #key (test id?)) 'unimplemented)
  1219.  
  1220. //(define-method copy-sequence ((l <list>))
  1221. //  (if (empty? l)
  1222. //      l
  1223. //      (pair (head l) (copy-sequence (tail l)))))
  1224. define method copy-sequence (l :: <list>)
  1225.     pair(head(l), copy-sequence(tail(l)));
  1226. end method;
  1227. define method copy-sequence (l == #())
  1228.     #()
  1229. end method;
  1230.  
  1231. //(define-method concatenate-as ((c <class>) (l <list>) #rest more-sequences) 'unimplemented)
  1232.  
  1233. //(define-method append2 ((l1 <list>) (l2 <list>)) (%list-append l1 l2))
  1234. define method append2 (l1 :: <list>, l2 :: <list>)
  1235.     %list-append(l1, l2);
  1236. end method;
  1237.  
  1238. //(define-method concatenate ((s <list>) #rest more-sequences)
  1239. //  (bind-methods ((help ((s <sequence>) (more <list>))
  1240. //                   (if (empty? more)
  1241. //               s
  1242. //               (help (append2 s (head more))
  1243. //                 (tail more)))))
  1244. //   (help s more-sequences)))
  1245.  
  1246. //(define-method replace-subsequence! ((l <list>) (insert <list>) #key (start 0)) 'unimplemented)
  1247.  
  1248. //(define-method reverse ((l <list>)) (%list-reverse l))
  1249. //(define-method reverse! ((l <list>)) (%list-reverse! l))
  1250.  
  1251. define method reverse (l :: <list>)
  1252.     %list-reverse(l);
  1253. end method;
  1254. define method reverse! (l :: <list>)
  1255.     %list-reverse!(l);
  1256. end method;
  1257.  
  1258. //(define-method sort ((l <list>) #key (test id?)) 'unimplemented)
  1259. //(define-method sort! ((l <list>) #key (test id?)) 'unimplemented)
  1260.  
  1261. //(define-method first-setter ((l <list>) obj) (%head-setter l obj))
  1262. //(define-method second-setter ((l <list>) obj) (head-setter (tail l) obj))
  1263. //(define-method third-setter ((l <list>) obj) (head-setter (tail (tail l)) obj))
  1264. //(define-method last ((l <list>) #key (default %default-object))
  1265. //  (%list-last l default))
  1266.  
  1267. //(define-method subsequence-position ((l <list>) pattern #key (test id?) (count 0))
  1268. //    'unimplemented)
  1269.  
  1270. //
  1271. // faster versions collection operations for <list>.
  1272. //
  1273.  
  1274. //(define-method size ((l <list>)) (%list-length l))
  1275. define method size (l :: <list>) %list-length(l); end method;
  1276.  
  1277. //(define-method length ((l <list>)) (%list-length l))
  1278. define method length (l :: <list>) %list-length(l); end method;
  1279.  
  1280. //(define-method empty? ((l <list>)) (id? l '()))
  1281. define method empty? (l == #()) #t; end method;
  1282. define method empty? (l :: <list>) #f; end method;
  1283.  
  1284. //(define-method map1 ((f <function>) (l <list>)) (%list-map1 f l))
  1285. define method map1 (f :: <function>, l :: <list>) %list-map1(f, l); end method;
  1286.  
  1287. //(define-method map ((f <function>) (l <list>) #rest more-lists)
  1288. //  (if (empty? more-lists)
  1289. //      (map1 f l)
  1290. //      (bind-methods ((help (lists)
  1291. //               (if (empty? (head lists))
  1292. //                   '()
  1293. //                   (pair (apply f (map1 head lists))
  1294. //                     (help (map1 tail lists))))))
  1295. //            (help (pair l more-lists)))))
  1296.  
  1297. define method map (f :: <function>, l :: <list>, #rest more-lists)
  1298.     if (empty?(more-lists))
  1299.         map1(f, l);
  1300.     else
  1301.         local method help (lists)
  1302.             if (empty?(head(lists)))
  1303.                 #();
  1304.             else
  1305.                 pair(apply(f, map1(head, lists)), help(map1(tail, lists)));
  1306.             end if;
  1307.         end help;
  1308.         help(pair(l, more-lists));
  1309.     end if;
  1310. end method;
  1311.  
  1312. //(define-method reduce ((f <function>) i (l <list>)) (%list-reduce f i l))
  1313. //(define-method reduce1 ((f <function>) (l <list>)) (%list-reduce1 f l))
  1314. //(define-method member? (el (l <list>) #key (test id?)) (%list-member? el l test))
  1315.  
  1316. define method reduce (f :: <function>, i, l :: <list>)
  1317.     %list-reduce(f, i, l);
  1318. end method;
  1319. define method reduce1 (f :: <function>, l :: <list>)
  1320.     %list-reduce1(f, l);
  1321. end method;
  1322. define method member? (el, l :: <list>, #key test (id?))
  1323.     %list-member?(el, l, test);
  1324. end method;
  1325.  
  1326. // member?(3, #(1,2,3));
  1327.  
  1328. //(define-method first ((l <list>) #key (default %default-object))
  1329. //  (%first l default))
  1330. //(define-method second ((l <list>) #key (default %default-object))
  1331. //  (%second l default))
  1332. //(define-method third ((l <list>) #key (default %default-object))
  1333. //  (%third l default))
  1334.  
  1335. define method first (l :: <list>, #key default (%default-object))
  1336.     %first(l, default);
  1337. end method;
  1338. define method second (l :: <list>, #key default (%default-object))
  1339.     %second(l, default);
  1340. end method;
  1341. define method third (l :: <list>, #key default (%default-object))
  1342.     %third(l, default);
  1343. end method;
  1344.  
  1345. //(define-method element ((l <list>) (i <integer>) #key (default %default-object))
  1346. //  (%list-element p i default))
  1347.  
  1348. define method element (l :: <list>, i :: <integer>, #key default (%default-object))
  1349.     %list-element(l, i, default);
  1350. end method;
  1351.  
  1352. //(define-method element-setter ((l <list>) (i <integer>) val)
  1353. //  (%list-element-setter l i val))
  1354.  
  1355. define method element-setter (l :: <list>, i :: <integer>, val)
  1356.     %list-element-setter(l, i, val);
  1357. end method;
  1358.  
  1359. //
  1360. // iteration protocol
  1361. //
  1362.  
  1363. //(define-method forward-iteration-protocol ((c <collection>))
  1364. //  (values 
  1365. //   (initial-state c)
  1366. //   (%collection-limit c)
  1367. //   next-state
  1368. //   finished-state?
  1369. //   current-key
  1370. //   current-element
  1371. //   current-element-setter
  1372. //   copy-state))
  1373.  
  1374. define method forward-iteration-protocol (c :: <collection>)
  1375.     values(
  1376.         initial-state(c),
  1377.         %collection-limit(c),
  1378.         next-state,
  1379.         finished-state?,
  1380.         current-key,
  1381.         current-element,
  1382.         current-element-setter,
  1383.         copy-state);
  1384. end method;
  1385.  
  1386. //(define-method backward-iteration-protocol ((c <collection>))
  1387. //  (values
  1388. //   (final-state c)
  1389. //   (%collection-limit c)
  1390. //   previous-state
  1391. //   finished-state?
  1392. //   current-key
  1393. //   current-element
  1394. //   current-element-setter
  1395. //   copy-state))
  1396.  
  1397. define method backward-iteration-protocol (c :: <collection>)
  1398.     values(
  1399.         final-state(c),
  1400.         %collection-limit(c),
  1401.         previous-state,
  1402.         finished-state?,
  1403.         current-key,
  1404.         current-element,
  1405.         current-element-setter,
  1406.         copy-state);
  1407. end method;
  1408.  
  1409. //(define-method %collection-limit ((c <collection>)) #f)
  1410. define method %collection-limit (c :: <collection>) #f end method;
  1411.  
  1412. //(define-method finished-state? ((c <collection>) state limit)
  1413. //  (id? state limit))
  1414. define method finished-state? (c :: <collection>, state, limit)
  1415.     id?(state, limit);
  1416. end method;
  1417.  
  1418. //(define-method initial-state ((l <list>))
  1419. //  (if (id? l '())
  1420. //      #f
  1421. //      l))
  1422.  
  1423. define method initial-state (l :: <list>)
  1424.     if (id?(l, #()))
  1425.         #f;
  1426.     else
  1427.         l;
  1428.     end if;
  1429. end method;
  1430.  
  1431. //(define-method next-state ((l <list>) (s <list>))
  1432. //  (cond
  1433. //   ((empty? s) #f)
  1434. //   ((empty? (tail s)) #f)
  1435. //   (#t (tail s))))
  1436.  
  1437. define method next-state (l :: <list>, state :: <list>)
  1438.     case
  1439.         empty?(state) => #f;
  1440.         empty?(tail(state)) => #f;
  1441.         otherwise => tail(state);
  1442.     end case;
  1443. end method;
  1444.  
  1445. define method current-key (c :: <collection>, state)
  1446.     error("Don't know how to find current key", c);
  1447. end method;
  1448.  
  1449. //(define-method current-element ((c <collection>) state)
  1450. //   (error "Don't know how to find current element" c))
  1451.  
  1452. define method current-element (c :: <collection>, state)
  1453.     error("Don't know how to find current element", c);
  1454. end method;
  1455.  
  1456. //(define-method current-element ((l <list>) (state <list>))
  1457. //  (head state))
  1458.  
  1459. define method current-element (l :: <list>, state :: <list>)
  1460.     head(state);
  1461. end method;
  1462.  
  1463. //(define-method current-element-setter ((l <list>) (s <pair>) obj)
  1464. //  (%head-setter s obj))
  1465.  
  1466. define method current-element-setter (l :: <list>, s :: <pair>, obj)
  1467.     %head-setter(s, obj);
  1468. end method;
  1469.  
  1470. //(define-method copy-state ((l <list>) s)
  1471. //  (copy-sequence s))
  1472.  
  1473. define method copy-state (l :: <list>, s :: <list>)
  1474.     copy-sequence(s);
  1475. end method;
  1476.  
  1477. //
  1478. // comparisons
  1479. //
  1480.  
  1481. //(define-method binary= ((p1 <pair>) (p2 <pair>))
  1482. //  (and (binary= (head p1) (head p2))
  1483. //       (binary= (tail p1) (tail p2))))
  1484.  
  1485. define method \= (p1 :: <pair>, p2 :: <pair>)
  1486.     head(p1) = head(p2) & tail(p1) = tail(p2);
  1487. end method;
  1488.  
  1489. // end list.dyl
  1490.  
  1491. //
  1492. // range.dyl
  1493. //
  1494. // range operations
  1495. //
  1496. //(define-class <range> (<sequence>)
  1497. //  (from    init-value:  0 init-keyword: from:)
  1498. //  (to      init-value: #f init-keyword: to:)
  1499. //  (above   init-value: #f init-keyword: above:)
  1500. //  (below   init-value: #f init-keyword: below:)
  1501. //  (by      init-value:  1 init-keyword: by:)
  1502. //  (size    init-value: #f init-keyword: size:))
  1503.  
  1504. //(define-method initialize ((range <range>) #rest args)
  1505. //  (bind ((from (from range))
  1506. //     (to (to range))
  1507. //     (above (above range))
  1508. //     (below (below range))
  1509. //     (by (by range))
  1510. //     (bmax (method (x y) (if x
  1511. //                 (max x y)
  1512. //                 y))))
  1513. //    (if (id? by 0)
  1514. //        (size-setter range #f)
  1515. //        (bind ((new-size (size range)))
  1516. //          (if to
  1517. //              (set! new-size 
  1518. //                (as <integer> (+ (/ (- to from) by) 1)))
  1519. //              #f)
  1520. //          (if above
  1521. //              (if (< by 0)
  1522. //              (set! new-size
  1523. //                (as <integer> (bmax new-size
  1524. //                            (/ (- above from) by))))
  1525. //              (set! new-size 0))
  1526. //              #f)
  1527. //          (if below
  1528. //              (if (> by 0)
  1529. //              (set! new-size
  1530. //                (as <integer> (bmax new-size
  1531. //                            (/ (- below from) by))))
  1532. //              (set! new-size 0))
  1533. //              #f)
  1534. //          (if new-size
  1535. //              (set! new-size (max new-size 0))
  1536. //              #f)
  1537. //          (size-setter range new-size)))))
  1538.  
  1539. //(define-method range (#rest args) (%apply make (pair <range> args)))
  1540.  
  1541. //(define-method element ((range <range>)
  1542. //            (index <integer>)
  1543. //            #key (default %default-object))
  1544. //  (case (size range)
  1545. //    ((0) (if (id? default %default-object)
  1546. //         (error "element: no elements in range")
  1547. //         default))
  1548. //    ((#f) (if (>= index 0)
  1549. //          (+ (from range) (* (by range) index))
  1550. //          (if (id? default %default-object)
  1551. //          (error  "element: index out of range" index)
  1552. //          default)))
  1553. //    (else: (if (or (>= index (size range)) (< index 0))
  1554. //           (if (id? default %default-object)
  1555. //           (error "element: index out of range" index)
  1556. //           default)
  1557. //           (+ (from range) (* (by range) index))))))
  1558.  
  1559. //(define-method member? (value (range <range>) #key (test id?))
  1560. //  (if (id? test id?)
  1561. //      (if (id? (element range (as <integer>
  1562. //                  (/ (- value (from range)) (by range)))
  1563. //            default: default)
  1564. //           value)
  1565. //      #t
  1566. //      #f)
  1567. //      (for-each ((x range))
  1568. //        ((test x value) #t))))
  1569.  
  1570. //(define-method copy-sequence ((r <range>) #key start end)
  1571. //  (bind ((s (if start start 0)))
  1572. //    (if end
  1573. //        (range from: (element r s) size: (+ (- end s) 1)
  1574. //           by: (by r))
  1575. //        (if (size r)
  1576. //        (range from: (element r s) by: (by r) size: (size r))
  1577. //        (range from: (element r s) by: (by r))))))
  1578.  
  1579. //(define-method binary= ((r1 <range>) (r2 <range>))
  1580. //  (and (= (from r1) (from r2))
  1581. //       (= (by r1)   (by r2))
  1582. //       (= (size r1) (size r2))))
  1583.  
  1584. //(define-method =hash ((r <range>))
  1585. //  (+ (=hash (from r)) (=hash (by r)) (=hash (size r))))
  1586.  
  1587. //(define-method reverse! ((r <range>))
  1588. //  (if (size r)
  1589. //      (begin
  1590. //    (from-setter r (last r))
  1591. //    (by-setter r (negative (by r)))
  1592. //    (above-setter r #f)
  1593. //    (to-setter r #f)
  1594. //    (below-setter r #f)
  1595. //    r)
  1596. //      (error "reverse!: unable to operate on unbounded range")))
  1597.  
  1598. //(define-method reverse ((r <range>))
  1599. //  (if (size r)
  1600. //      (range from: (last r) size: (size r) by: (- (by r)))
  1601. //      (error "reverse: unable to operate on unbounded range")))
  1602.  
  1603. //
  1604. // iteration protocol
  1605. //
  1606.  
  1607. //(define-method initial-state ((range <range>))
  1608. //  (bind ((x (pair #f #f))
  1609. //     (result (element range 0 default: x)))
  1610. //    (if (id? x result)
  1611. //        #f
  1612. //        0)))
  1613.  
  1614. //(define-method next-state ((range <range>) state)
  1615. //  (bind ((x (pair #f #f))
  1616. //     (result (element range (+ state 1) default: x)))
  1617. //    (if (id? x result)
  1618. //        #f
  1619. //        (+ state 1))))
  1620.  
  1621. //(define-method current-element ((range <range>) state)
  1622. //  (element range state))
  1623.  
  1624. // end range.dyl
  1625.  
  1626. //
  1627. // string.dyl
  1628. //
  1629. // string operations 
  1630. //
  1631.  
  1632. //(define-method element ((s <string>)
  1633. //            (i <integer>) 
  1634. //            #key 
  1635. //            (default %default-object))
  1636. //  (%string-element s i default))
  1637. define method element (s :: <string>, i :: <integer>, #key default (%default-object))
  1638.     %string-element(s, i, default);
  1639. end method;
  1640.  
  1641. //(define-method element-setter ((s <string>) (i <integer>) (c <character>))
  1642. //  (%string-element-setter s i c))
  1643. define method element-setter (s :: <string>, i :: <integer>, c :: <character>)
  1644.     %string-element-setter (s, i, c);
  1645. end method;
  1646.  
  1647. //(define-method size ((s <string>)) (%string-size s))
  1648. //(define-method length ((s <string>)) (%string-size s))
  1649. //(define-method append2 ((s1 <string>) (s2 <string>)) (%string-append2 s1 s2))
  1650. define method size (s :: <string>) %string-size(s); end method;
  1651. define method length (s :: <string>) %string-size(s); end method;
  1652. define method append2 (s1 :: <string>, s2 :: <string>) %string-append2(s1, s2); end method;
  1653.  
  1654. //
  1655. // iteration protocol
  1656. //
  1657.  
  1658. //(define-method initial-state ((s <string>))
  1659. //  (if (= (size s) 0)
  1660. //      #f
  1661. //      0))
  1662. define method initial-state (s :: <string>)
  1663.     if (size(s) = 0) #f; else 0; end if;
  1664. end method;
  1665.  
  1666. //(define-method next-state ((s <string>) (state <integer>))
  1667. //  (if (< state (- (size s) 1))
  1668. //      (+ state 1)
  1669. //      #f))
  1670. define method next-state (s :: <string>, state :: <integer>)
  1671.     if (state < size(s)) state + 1; else #f; end if;
  1672. end method;
  1673.  
  1674. //(define-method current-element ((s <string>) (state <integer>))
  1675. //  (%string-element s state %default-object))
  1676. define method current-element (s :: <string>, state :: <integer>)
  1677.     %string-element(s, state, %default-object);
  1678. end method;
  1679.  
  1680. //(define-method current-element-setter ((s <string>) (state <integer>) obj)
  1681. //  (%string-element-setter s state obj))
  1682. define method current-element-setter (s :: <string>, state :: <integer>, obj)
  1683.     %string-element-setter(s, state, obj);
  1684. end method;
  1685.  
  1686. //(define-method copy-state ((s <string>) (state <integer>)) state)
  1687. define method copy-state (s :: <string>, state :: <integer>) state; end method;
  1688.  
  1689. // comparisons
  1690.  
  1691. //(define-method binary< ((s1 <string>) (s2 <string>))
  1692. //  (bind ((result #f))
  1693. //    (for ((s1state (initial-state s1) (next-state s1 s1state))
  1694. //          (s2state (initial-state s2) (next-state s2 s2state)))
  1695. //         ((if (not s1state)
  1696. //          (begin (and s2state (set! result #t))
  1697. //             #t)
  1698. //          (if s2state
  1699. //              (if (< (current-element s1 s1state)
  1700. //                 (current-element s2 s2state))
  1701. //              (begin (set! result #t)
  1702. //                 #t)
  1703. //              #f)
  1704. //              #t))
  1705. //          result))))
  1706.  
  1707. // <pcb> -- these should use fast primitives rather than iteration protocol.
  1708. define method binary< (s1 :: <string>, s2 :: <string>)
  1709.     %string-binary<(s1, s2);
  1710. end method;
  1711.  
  1712. //(define-method binary= ((s1 <string>) (s2 <string>))
  1713. //  (and (= (size s1) (size s2)) (every? = s1 s2)))
  1714. define method binary= (s1 :: <string>, s2 :: <string>)
  1715.     %string-binary=(s1, s2);
  1716. end method;
  1717.  
  1718. // end string.yl
  1719.  
  1720. //
  1721. // vector.dyl
  1722. //
  1723. // Brent Benson
  1724. //
  1725.  
  1726. //(define-method vector (#rest els) (%vector els))
  1727.  
  1728. define method vector (#rest els)
  1729.     %vector(els);
  1730. end method;
  1731.  
  1732. //(define-method element ((v <vector>)
  1733. //            (i <integer>)
  1734. //            #key (default %default-object))
  1735. //  (%vector-element v i default))
  1736.  
  1737. define method element (v :: <vector>, i :: <integer>, #key default (%default-object))
  1738.     %vector-element(v, i, default);
  1739. end method;
  1740.  
  1741. //(define-method element-setter ((v <vector>) (i <integer>) obj)
  1742. //  (%vector-element-setter v i obj))
  1743.  
  1744. define method element-setter (v :: <vector>, i :: <integer>, obj)
  1745.     %vector-element-setter(v, i, obj);
  1746. end method;
  1747.  
  1748. //(define-method size ((v <vector>)) (%vector-size v))
  1749.  
  1750. define method size (v :: <vector>) %vector-size(v); end method;
  1751.  
  1752. //(define-method dimensions ((v <vector>)) (list (%vector-size v)))
  1753.  
  1754. define method dimensions (v :: <vector>) list(%vector-size(v)); end method;
  1755.  
  1756. //(define-method length ((v <vector>)) (%vector-size v))
  1757.  
  1758. define method length(v :: <vector>) %vector-size(v); end method;
  1759.  
  1760. //(define-method append2 ((v1 <vector>) (v2 <vector>)) (%vector-append2 v1 v2))
  1761.  
  1762. define method append2(v1 :: <vector>, v2 :: <vector>) %vector-append2(v1, v2); end method;
  1763.  
  1764. //
  1765. // iteration protocol
  1766. //
  1767.  
  1768. //(define-method initial-state ((v <vector>))
  1769. //  (if (= (size v) 0)
  1770. //      #f
  1771. //      0))
  1772.  
  1773. define method initial-state (v :: <vector>)
  1774.     if (size(v) = 0)
  1775.         #f;
  1776.     else
  1777.         0;
  1778.     end if;
  1779. end method;
  1780.  
  1781. //(define-method next-state ((v <vector>) (state <integer>))
  1782. //  (if (< state (- (size v) 1))
  1783. //      (+ state 1)
  1784. //      #f))
  1785.  
  1786. define method next-state (v :: <vector>, state :: <integer>)
  1787.     if (state < (size(v) - 1))
  1788.         state + 1;
  1789.     else
  1790.         #f;
  1791.     end if;
  1792. end method;
  1793.  
  1794. //(define-method current-element ((v <vector>) (state <integer>))
  1795. //  (%vector-element v state %default-object))
  1796.  
  1797. define method current-element (v :: <vector>, state :: <integer>)
  1798.     %vector-element(v, state, %default-object);
  1799. end method;
  1800.  
  1801. //(define-method current-element-setter ((v <vector>) (state <integer>) obj)
  1802. //  (%vector-element-setter v state obj))
  1803.  
  1804. define method current-element-setter (v :: <vector>, state :: <integer>, obj)
  1805.     %vector-element-setter(v, state, obj);
  1806. end method;
  1807.  
  1808. //(define-method copy-state ((v <vector>) (state <integer>)) state)
  1809.  
  1810. define method copy-state (v :: <vector>, state :: <integer>) state; end method;
  1811.  
  1812. //(define-method previous-state ((v <vector>) (state <integer>))
  1813. //  (if (<= state 0)
  1814. //      #f
  1815. //      (- state 1)))
  1816.  
  1817. define method previous-state (v :: <vector>, state :: <integer>)
  1818.     if (state > 0)
  1819.         state - 1;
  1820.     else
  1821.         #f;
  1822.     end if;
  1823. end method;
  1824.  
  1825. //(define-method final-state ((v <vector>)) (- (size v) 1))
  1826.  
  1827. define method final-state (v :: <vector>) size(v) - 1; end method;
  1828.  
  1829. // end vector.dyl
  1830.  
  1831. // stretchy-vector
  1832. //
  1833. // jnw@cis.ufl.edu
  1834. //
  1835.  
  1836. //(define-class <stretchy-vector> (<stretchy-collection> <vector>)
  1837. //  (rep type: <vector> )
  1838. //  (size init-keyword: size:)
  1839. //  (fill init-keyword: fill:))
  1840.  
  1841. define class <stretchy-vector> (<stretchy-collection>, <vector>)
  1842.     slot rep, type: <vector>;
  1843.     slot size, init-keyword: size:, init-value: 0;
  1844.     slot fill, init-keyword: fill:, init-value: #f;
  1845. end class;
  1846.  
  1847. // initialize method.
  1848. define method initialize (sv :: <stretchy-vector>, #key, #all-keys)
  1849.     next-method();
  1850.     sv.rep := make(<vector>, size: sv.size, fill: sv.fill);
  1851. end method;
  1852.  
  1853. // end stretchy-vector
  1854.  
  1855. //
  1856. // table.dyl
  1857. //
  1858. // Brent Benson
  1859. //
  1860.  
  1861. //(define-method element ((t <table>) key #key (default %default-object))
  1862. //  (%table-element t key default))
  1863.  
  1864. define method element (t :: <table>, key, #key default (%default-object))
  1865.     %table-element(t, key, default);
  1866. end method;
  1867.  
  1868. //(define-method element-setter ((t <table>) key value) (%table-element-setter t key value))
  1869.  
  1870. define method element-setter (t :: <table>, key, value)
  1871.     %table-element-setter(t, key, value);
  1872. end method;
  1873.  
  1874. //(define-method initial-state ((t <table>)) (%table-initial-state t))
  1875.  
  1876. define method initial-state (t :: <table>) %table-initial-state(t); end method;
  1877.  
  1878. //(define-method next-state ((t <table>) (te <table-entry>)) (%table-next-state t te))
  1879.  
  1880. define method next-state (t :: <table>, te :: <table-entry>)
  1881.     %table-next-state(t, te);
  1882. end method;
  1883.  
  1884. //(define-method current-element ((t <table>) (te <table-entry>)) (%table-current-element t te))
  1885.  
  1886. define method current-element (t :: <table>, te :: <table-entry>)
  1887.     %table-current-element(t, te);
  1888. end method;
  1889.  
  1890. //(define-method current-element-setter ((t <table>) (te <table-entry>) value)
  1891. //  (%table-current-element-setter t te value))
  1892.  
  1893. define method current-element-setter (t :: <table>, te :: <table-entry>, value)
  1894.     %table-current-element-setter(t, te, value);
  1895. end method;
  1896.  
  1897. //(define-method current-key ((t <table>) (te <table-entry>)) (%table-current-key t te))
  1898.  
  1899. define method current-key (t :: <table>, te :: <table-entry>)
  1900.     %table-current-key(t, te);
  1901. end method;
  1902.  
  1903. //(define-method key-sequence ((t <table>))
  1904. //  (bind ((keys '()))
  1905. //    (for ((state (initial-state t) (next-state t state)))
  1906. //    ((not state) keys)
  1907. //      (set! keys (pair (current-key t state) keys)))))
  1908.  
  1909. define method key-sequence (t :: <table>)
  1910.     let keys = #();
  1911.     for (state = initial-state(t) then next-state(t, state) until (~state))
  1912.         keys := pair(current-key(t, state), keys);
  1913.     finally
  1914.         keys;
  1915.     end for;
  1916. end method;
  1917.  
  1918. // end table.dyl
  1919.  
  1920. //
  1921. // deque.dyl
  1922. //
  1923. // Brent Benson
  1924. //
  1925.  
  1926. //(define-method push ((d <deque>) new) (%push d new))
  1927. //(define-method pop ((d <deque>)) (%pop d))
  1928. //(define-method push-last ((d <deque>) new) (%push-last d new))
  1929. //(define-method pop-last ((d <deque>)) (%pop-last d))
  1930.  
  1931. define method push (d :: <deque>, new)
  1932.     %push(d, new);
  1933. end method;
  1934. define method pop (d :: <deque>)
  1935.     %pop(d);
  1936. end method;
  1937. define method push-last (d :: <deque>, new)
  1938.     %push-last(d, new);
  1939. end method;
  1940. define method pop-last (d :: <deque>)
  1941.     %pop-last(d, new);
  1942. end method;
  1943.  
  1944. //(define-method first ((d <deque>) #key (default %default-object))
  1945. //  (%deque-first d default))
  1946.  
  1947. define method first (d :: <deque>, #key default (%default-object))
  1948.     %deque-first(d, default);
  1949. end method;
  1950.  
  1951. //(define-method last ((d <deque>) #key (default %default-object))
  1952. //  (%deque-last d default))
  1953.  
  1954. define method last (d :: <deque>, #key default (%default-object))
  1955.     %deque-last(d, default);
  1956. end method;
  1957.  
  1958. // should add specific (define-method last-setter ((d <deque>) new-value) ...)
  1959. //(define-method element ((d <deque>)
  1960. //            (i <integer>)
  1961. //            #key (default %default-object))
  1962. //  (%deque-element d i default))
  1963.  
  1964. define method element (d :: <deque>, i :: <integer>, #key default (%default-object))
  1965.     %deque-element(d, i, new);
  1966. end method;
  1967.  
  1968. //(define-method element-setter ((d <deque>) (i <integer>) new) 
  1969. //  (%deque-element-setter d i new))
  1970.  
  1971. define method element-setter (d :: <deque>, i :: <integer>, new)
  1972.     %deque-element-setter(d, i, new);
  1973. end method;
  1974.  
  1975. //(define-method add! ((d <deque>) new) (%push d new))
  1976.  
  1977. define method add! (d :: <deque>, new)
  1978.     %push(d, new);
  1979. end method;
  1980.  
  1981. //
  1982. // add remove!
  1983. // 
  1984.  
  1985. //
  1986. // iteration protocol
  1987. //
  1988.  
  1989. //(define-method initial-state ((d <deque>)) (%deque-initial-state d))
  1990. //(define-method final-state ((d <deque>)) (%deque-final-state d))
  1991.  
  1992. define method initial-state (d :: <deque>)
  1993.     %deque-initial-state(d);
  1994. end method;
  1995. define method final-state (d :: <deque>)
  1996.     %deque-final-state(d);
  1997. end method;
  1998.  
  1999. //(define-method next-state ((d <deque>) (state <deque-entry>)) 
  2000. //  (%deque-next-state d state))
  2001. //(define-method previous-state ((d <deque>) (state <deque-entry>)) 
  2002. //  (%deque-previous-state d state))
  2003.  
  2004. define method next-state (d :: <deque>, state :: <deque-entry>)
  2005.     %deque-next-state(d, state);
  2006. end method;
  2007. define method previous-state (d :: <deque>, state :: <deque-entry>)
  2008.     %deque-previous-state(d, state);
  2009. end method;
  2010.  
  2011. //(define-method current-element ((d <deque>) (state <deque-entry>)) 
  2012. //  (%deque-current-element d state))
  2013. //(define-method current-element-setter ((d <deque>)
  2014. //                       (state <deque-entry>)
  2015. //                       new-value) 
  2016. //  (%deque-current-element-setter d state new-value))
  2017.  
  2018. define method current-element (d :: <deque>, state :: <deque-entry>)
  2019.     %deque-current-element(d, state);
  2020. end method;
  2021. define method current-element-setter (d :: <deque>, state :: <deque-entry>, new-value)
  2022.     %deque-current-element-setter(d, state, newvalue);
  2023. end method;
  2024.  
  2025. // end deque.dyl
  2026.  
  2027. //
  2028. // array.dyl
  2029. //
  2030. // Brent Benson
  2031. //
  2032.  
  2033. // need to add default
  2034.  
  2035. //(define-method element ((a <array>)
  2036. //            (indices <list>)
  2037. //            #key (default %default-object))
  2038. //  (%array-element a indices default))
  2039. //(define-method element-setter ((a <array>) (inds <list>) new-value)
  2040. //  (%array-element-setter a inds new-value))
  2041.  
  2042. define method element (a :: <array>, indices :: <list>, #key default (%default-object))
  2043.     %array-element(a, indices, default);
  2044. end method;
  2045. define method element-setter (a :: <array>, indices :: <list>, new-value)
  2046.     %array-element-setter(a, indices, default);
  2047. end method;
  2048.  
  2049. //(define-method dimensions ((a <array>)) (%array-dimensions a))
  2050. //(define-method size ((a <array>)) (reduce * 1 (%array-dimensions a)))
  2051. //(define-method rank ((a <array>)) (length (%array-dimensions a)))
  2052. //(define-method row-major-index ((a <array>) #rest subscripts)
  2053. //  (%array-row-major-index a subscripts))
  2054.  
  2055. define method dimensions (a :: <array>)
  2056.     %array-dimensions(a);
  2057. end method;
  2058. define method size (a :: <array>)
  2059.     reduce(\*, 1, %array-dimensions(a));
  2060. end method;
  2061. define method rank (a :: <array>)
  2062.     length(%array-dimensions(a));
  2063. end method;
  2064. define method row-major-index(a :: <array>, #rest subscripts)
  2065.     %array-row-major-index(a, subscripts);
  2066. end method;
  2067.  
  2068. //(define-method aref ((a <array>) #rest indices) (%array-element a indices %default-object))
  2069.  
  2070. define method aref (a :: <array>, #rest indices)
  2071.     %array-element(a, indices, %default-object);
  2072. end method;
  2073.  
  2074. //(define-method aref-setter ((a <array>) #rest indicies-and-val)
  2075. //  (bind-methods ((but-last (lst)
  2076. //           (cond
  2077. //            ((empty? lst) '())
  2078. //            ((empty? (tail lst)) '())
  2079. //            (else: (pair (head lst) (but-last (tail lst)))))))
  2080. //    (bind ((new-val (last indicies-and-val))
  2081. //       (indicies (but-last indicies-and-val)))
  2082. //      (%array-element-setter a indicies new-val))))
  2083.  
  2084. define method aref-setter (a :: <array>, #rest indicies-and-val)
  2085.     local method except-last (lst)
  2086.         if (empty?(lst) | empty?(tail(lst)))
  2087.             #();
  2088.         else
  2089.             pair(head(lst), except-last(tail(lst)));
  2090.         end if;
  2091.     end but-last;
  2092.     let new-val = last(indicies-and-val);
  2093.     let indicies = except-last(indicies-and-val);
  2094.     %array-element-setter(a, indicies, new-val);
  2095. end method;
  2096.  
  2097. //(define-method dimension ((array <array>) (axis <integer>))
  2098. //  (element (dimensions array) axis))
  2099.  
  2100. define method dimension (a :: <array>, axis :: <integer>)
  2101.     dimensions(a)[axis];
  2102. end method;
  2103.  
  2104. //
  2105. // iteration protocol
  2106. //
  2107.  
  2108. //(define-method initial-state ((a <array>)) (%array-initial-state a))
  2109. //(define-method next-state ((a <array>) (s <integer>))
  2110. //  (%array-next-state a s))
  2111.  
  2112. define method initial-state (a :: <array>)
  2113.     %array-initial-state(a);
  2114. end method;
  2115.  
  2116. define method next-state (a :: <array>, state :: <integer>)
  2117.     %array-next-state(a, state);
  2118. end method;
  2119.  
  2120. //(define-method current-element ((a <array>) (s <integer>))
  2121. //  (%array-current-element a s))
  2122.  
  2123. define method current-element (a :: <array>, state :: <integer>)
  2124.     %array-current-element(a, state);
  2125. end method;
  2126.  
  2127. // end array.dyl
  2128.  
  2129. //
  2130. // numbers
  2131. //
  2132.  
  2133. //
  2134. // number.dyl - generic functions on numbers
  2135. //
  2136. // Brent Benson
  2137. //
  2138.  
  2139. //
  2140. // misc
  2141. //
  2142. //(define-method odd? ((i <integer>)) (%odd? i))
  2143. //(define-method even? ((i <integer>)) (%even? i))
  2144. //(define-method zero? ((i <integer>)) (%int-zero? i))
  2145. //(define-method zero? ((d <double-float>)) (%double-zero? d))
  2146. //(define-method positive? ((i <integer>)) (%int-positive? i))
  2147. //(define-method positive? ((d <double-float>)) (%double-positive? d))
  2148. //(define-method negative? ((i <integer>)) (%int-negative? i))
  2149. //(define-method negative? ((d <double-float>)) (%double-negative? d))
  2150. //(define-method integral? ((n <number>)) (%integral? n))
  2151. //(define-method quotient ((i1 <integer>) (i2 <integer>)) (%quotient i1 i2))
  2152.  
  2153. define method odd? (i :: <integer>) %odd?(i); end method;
  2154. define method even? (i :: <integer>) %even?(i); end method;
  2155. define method zero? (i :: <integer>) %int-zero?(i); end method;
  2156. define method zero? (d :: <double-float>) %double-zero?(d); end method;
  2157. define method positive? (i :: <integer>) %int-positive?(i); end method;
  2158. define method positive? (d :: <double-float>) %double-positive?(d); end method;
  2159. define method negative? (i :: <integer>) %int-negative?(i); end method;
  2160. define method negative? (d :: <double-float>) %double-negative?(d); end method;
  2161. define method integral? (n :: <number>) %integral?(n); end method;
  2162. define method quotient (i1 :: <integer>, i2 :: <integer>) %quotient?(i1, i2); end method;
  2163.  
  2164. //
  2165. // coercions
  2166. //
  2167. //(define-method as ((df-class (singleton <double-float>)) (i <integer>))
  2168. //  (%int-to-double i))
  2169.  
  2170. define method as (df-class == <double-float>, i :: <integer>)
  2171.     %int-to-double(i);
  2172. end method;
  2173.  
  2174. //(define-method as ((int-class (singleton <integer>)) (df <double-float>))
  2175. //  (%double-to-int df))
  2176.  
  2177. define method as (df-class == <integer>, df :: <double-float>)
  2178.     %double-to-int(df);
  2179. end method;
  2180.  
  2181. //
  2182. // multi-argument versions (?)
  2183. //
  2184.  
  2185. //(define-method + ((n1 <number>) (n2 <number>)) (binary+ n1 n2))
  2186. //(define-method * ((n1 <number>) (n2 <number>)) (binary* n1 n2))
  2187.  
  2188. define method \+ (n1 :: <number>, n2 :: <number>)
  2189.     binary+(n1, n2);
  2190. end method;
  2191. define method \* (n1 :: <number>, n2 :: <number>)
  2192.     binary*(n1, n2);
  2193. end method;
  2194.  
  2195. //(define-method negative ((i <integer>)) (%int-negative i))
  2196. //(define-method negative ((d <double-float>)) (%double-negative d))
  2197.  
  2198. define method negative (i :: <integer>) %int-negative(i); end method;
  2199. define method negative (d :: <double-float>) %double-negative(d); end method;
  2200.  
  2201. //(define-method - ((n1 <number>) (n2 <number>))
  2202. //  (binary- n1 n2))
  2203.  
  2204. define method \- (n1 :: <number>, n2 :: <number>)
  2205.     binary-(n1, n2);
  2206. end method;
  2207.   
  2208. //(define-method unary/ ((i <integer>)) (%int-inverse i))
  2209. //(define-method unary/ ((d <double-float>)) (%double-inverse d))
  2210. //(define-method / ((n1 <number>) (n2 <number>))
  2211. //   ( binary/ n1 n2))
  2212.  
  2213. define method unary/ (i :: <integer>) %int-inverse(i); end method;
  2214. define method unary/ (d :: <double-float>) %double-inverse(i); end method;
  2215. define method \/ (n1 :: <number>, n2 :: <number>)
  2216.     binary/(n1, n2);
  2217. end method;
  2218.  
  2219. //
  2220. // (op <integer> <integer>)
  2221. // <integer> op <integer>
  2222. //
  2223.  
  2224. //(define-method binary+ ((i1 <integer>) (i2 <integer>))
  2225. //  (%binary-int+ i1 i2))
  2226.  
  2227. define method binary+ (i1 :: <integer>, i2 :: <integer>)
  2228.     %binary-int+(i1, i2);
  2229. end method;
  2230.  
  2231. //(define-method binary- ((i1 <integer>) (i2 <integer>))
  2232. //  (%binary-int- i1 i2))
  2233.  
  2234. define method binary- (i1 :: <integer>, i2 :: <integer>)
  2235.     %binary-int-(i1, i2);
  2236. end method;
  2237.  
  2238. //(define-method binary* ((i1 <integer>) (i2 <integer>))
  2239. //  (%binary-int* i1 i2))
  2240.  
  2241. define method binary* (i1 :: <integer>, i2 :: <integer>)
  2242.     %binary-int*(i1, i2);
  2243. end method;
  2244.  
  2245. //(define-method binary/ ((i1 <integer>) (i2 <integer>))
  2246. //  (%binary-int/ i1 i2))
  2247.  
  2248. define method binary/ (i1 :: <integer>, i2 :: <integer>)
  2249.     %binary-int/(i1, i2);
  2250. end method;
  2251.  
  2252. //
  2253. // (op <double-float> <double-float>)
  2254. // <double-float> op <double-float>
  2255. //
  2256.  
  2257. //(define-method binary+ ((d1 <double-float>) (d2 <double-float>))
  2258. //  (%binary-double+ d1 d2))
  2259. define method binary+ (d1 :: <double-float>, d2 :: <double-float>)
  2260.     %binary-double+(d1, d2);
  2261. end method;
  2262.  
  2263. //(define-method binary- ((d1 <double-float>) (d2 <double-float>))
  2264. //  (%binary-double- d1 d2))
  2265. define method binary- (d1 :: <double-float>, d2 :: <double-float>)
  2266.     %binary-double-(d1, d2);
  2267. end method;
  2268.  
  2269. //(define-method binary* ((d1 <double-float>) (d2 <double-float>))
  2270. //  (%binary-double* d1 d2))
  2271. define method binary* (d1 :: <double-float>, d2 :: <double-float>)
  2272.     %binary-double*(d1, d2);
  2273. end method;
  2274.  
  2275. //(define-method binary/ ((d1 <double-float>) (d2 <double-float>))
  2276. //  (%binary-double/ d1 d2))
  2277. define method binary/ (d1 :: <double-float>, d2 :: <double-float>)
  2278.     %binary-double/(d1, d2);
  2279. end method;
  2280.  
  2281. //
  2282. // (op <integer> <double-float>)
  2283. // <integer> op <double-float>
  2284. //
  2285.  
  2286. //(define-method binary+ ((i1 <integer>) (d2 <double-float>))
  2287. //  (%binary-double+ (as <double-float> i1) d2))
  2288.  
  2289. define method binary+ (i1 :: <integer>, d2 :: <double-float>)
  2290.     %binary-double+(as(<double-float>, i1), d2);
  2291. end method;
  2292.  
  2293. //(define-method binary- ((i1 <integer>) (d2 <double-float>))
  2294. //  (%binary-double- (as <double-float> i1) d2))
  2295.  
  2296. define method binary- (i1 :: <integer>, d2 :: <double-float>)
  2297.     %binary-double-(as(<double-float>, i1), d2);
  2298. end method;
  2299.  
  2300. //(define-method binary* ((i1 <integer>) (d2 <double-float>))
  2301. //  (%binary-double* (as <double-float> i1) d2))
  2302.  
  2303. define method binary* (i1 :: <integer>, d2 :: <double-float>)
  2304.     %binary-double*(as(<double-float>, i1), d2);
  2305. end method;
  2306.  
  2307. //(define-method binary/ ((i1 <integer>) (d2 <double-float>))
  2308. //  (%binary-double/ (as <double-float> i1) d2))
  2309.  
  2310. define method binary/ (i1 :: <integer>, d2 :: <double-float>)
  2311.     %binary-double/(as(<double-float>, i1), d2);
  2312. end method;
  2313.  
  2314. //
  2315. // (op <double-float> <integer>)
  2316. //
  2317. //(define-method binary+ ((d1 <double-float>) (i2 <integer>))
  2318. //  (%binary-double+ d1 (as <double-float> i2)))
  2319.  
  2320. define method binary+ (d1 :: <double-float>, i2 :: <integer>)
  2321.     %binary-double+(d1, as(<double-float>, i2));
  2322. end method;
  2323.  
  2324. //(define-method binary- ((d1 <double-float>) (i2 <integer>))
  2325. //  (%binary-double- d1 (as <double-float> i2)))
  2326.  
  2327. define method binary- (d1 :: <double-float>, i2 :: <integer>)
  2328.     %binary-double-(d1, as(<double-float>, i2));
  2329. end method;
  2330.  
  2331. //(define-method binary* ((d1 <double-float>) (i2 <integer>))
  2332. //  (%binary-double* d1 (as <double-float> i2)))
  2333.  
  2334. define method binary* (d1 :: <double-float>, i2 :: <integer>)
  2335.     %binary-double*(d1, as(<double-float>, i2));
  2336. end method;
  2337.  
  2338. //(define-method binary/ ((d1 <double-float>) (i2 <integer>))
  2339. //  (%binary-double/ d1 (as <double-float> i2)))
  2340.  
  2341. define method binary/ (d1 :: <double-float>, i2 :: <integer>)
  2342.     %binary-double/(d1, as(<double-float>, i2));
  2343. end method;
  2344.  
  2345. //
  2346. // comparisons
  2347. //
  2348.  
  2349. //(define-method binary= ((n1 <number>) (n2 <number>))
  2350. //  (id? n1 n2))
  2351.  
  2352. // default \= for <object> suffices. binary= is obsolete. it
  2353. // should instead be \=.
  2354.  
  2355. //(define-method binary= ((i <integer>) (d <double-float>))
  2356. //  (id? (as <double-float> i) d))
  2357.  
  2358. define method \= (i :: <integer>, d :: <double-float>)
  2359.     as(<double-float>, i) == d;
  2360. end method;
  2361.  
  2362. // (define-method binary= ((d <double-float>) (i <integer>))
  2363. //  (id? d (as <double-float> i)))
  2364.  
  2365. define method \= (d :: <double-float>, i :: <integer>)
  2366.     d == as(<double-float>, i);
  2367. end method;
  2368.  
  2369. //(define-method binary< ((n1 <number>) (n2 <number>))
  2370. //  (%binary-less-than n1 n2))
  2371.  
  2372. define method \< (n1 :: <number>, n2 :: <number>)
  2373.     %binary-less-than(n1, n2);
  2374. end method;
  2375.  
  2376. //(define-method max ((n1 <real>) #rest more-reals)
  2377. //  (bind-methods ((help ((n1 <real>) more)
  2378. //           (if (empty? more)
  2379. //               n1
  2380. //               (bind ((n2 (head more))
  2381. //                  (largest (if (binary< n1 n2) n2 n1)))
  2382. //             (help largest (tail more))))))
  2383. //    (help n1 more-reals)))
  2384.  
  2385. //define method max (n1 :: <real>, #rest more-reals)
  2386. //    local method help (n1 :: <real>, more)
  2387. //        if (empty?(more))
  2388. //            n1;
  2389. //        else
  2390. //            let n2 = head(more);
  2391. //            let largest = if (n1 > n2) n1 else n2; end if;
  2392. //            help(largest, tail(more));
  2393. //        end if;
  2394. //    end help;
  2395. //    help(n1, more-reals);
  2396. //end method;
  2397.  
  2398. // more imperatively... (i.e. faster)
  2399. define method max (n1 :: <real>, #rest more-reals)
  2400.     let largest = n1;
  2401.     until (more-reals == #())
  2402.         let n = head(more-reals);
  2403.         if (n > largest)
  2404.             largest := n;
  2405.         end if;
  2406.         more-reals := tail(more-reals);
  2407.     end until;
  2408.     largest;
  2409. end method;
  2410.  
  2411. //(define-method min ((n1 <real>) #rest more-reals)
  2412. //  (bind-methods ((help ((n1 <real>) more)
  2413. //           (if (empty? more)
  2414. //               n1
  2415. //               (bind ((n2 (head more))
  2416. //                  (smallest (if (binary< n1 n2) n1 n2)))
  2417. //             (help smallest (tail more))))))
  2418. //    (help n1 more-reals)))
  2419.  
  2420. //define method min (n1 :: <real>, #rest more-reals)
  2421. //    local method help (n1 :: <real>, more)
  2422. //        if (empty?(more))
  2423. //            n1;
  2424. //        else
  2425. //            let n2 = head(more);
  2426. //            let smallest = if (n1 < n2) n1 else n2; end if;
  2427. //            help(smallest, tail(more));
  2428. //        end if;
  2429. //    end help;
  2430. //    help(n1, more-reals);
  2431. //end method;
  2432.  
  2433. define method min (n1 :: <real>, #rest more-reals)
  2434.     let smallest = n1;
  2435.     until (more-reals == #())
  2436.         let n = head(more-reals);
  2437.         if (n < smallest)
  2438.             smallest := n;
  2439.         end if;
  2440.         more-reals := tail(more-reals);
  2441.     end until;
  2442.     smallest;
  2443. end method;
  2444.  
  2445. //
  2446. // other functions
  2447. //
  2448.  
  2449. //(define-method sqrt ((i <integer>)) (%int-sqrt i))
  2450. // (define-method sqrt ((d <double-float>)) (%double-sqrt d))
  2451.  
  2452. define method sqrt (i :: <integer>)
  2453.     %int-sqrt(i);
  2454. end method;
  2455. define method sqrt (d :: <double-float>)
  2456.     %double-sqrt(d);
  2457. end method;
  2458.  
  2459. // (define-method abs ((i <integer>)) (%int-abs i))
  2460. // (define-method abs ((d <double-float>)) (%double-abs d))
  2461.  
  2462. define method abs (i :: <integer>)
  2463.     %int-abs(i);
  2464. end method;
  2465. define method abs (d :: <double-float>)
  2466.     %double-abs(d);
  2467. end method;
  2468.  
  2469. //(define-method ash ((i <integer>) (count <integer>)) (%ash i count))
  2470.  
  2471. define method ash (i :: <integer>, count :: <integer>)
  2472.     %ash(i, count);
  2473. end method;
  2474.  
  2475. //(define-method sin ((n <number>)) (%sin (as <double-float> n)))
  2476. //(define-method cos ((n <number>)) (%cos (as <double-float> n)))
  2477.  
  2478. define method sin (n :: <number>)
  2479.     %sin(as(<double-float>, n));
  2480. end method;
  2481. define method cos (n :: <number>)
  2482.     %cos(as(<double-float>, n));
  2483. end method;
  2484.  
  2485. //(define-method atan2 ((n1 <number>) (n2 <number>))
  2486. //     (%atan2 (as <double-float> n1) (as <double-float> n2)))
  2487.  
  2488. define method atan2 (n1 :: <number>, n2 :: <number>)
  2489.     %atan2(as(<double-float>, n1), as(<double-float>, n2));
  2490. end method;
  2491.  
  2492. //(define-method logior (#rest integers) (reduce1 %binary-logior integers))
  2493. //(define-method logand (#rest integers) (reduce1 %binary-logand integers))
  2494. //(define-method truncate ((n <number>)) (%truncate (as <double-float> n)))
  2495. //(define-method modulo ((i1 <number>) (i2 <number>))
  2496. //   (%modulo i1 i2))
  2497.  
  2498. // exp and ln.
  2499. //(define-method exp ((n <number>)) (%exp (as <double-float> n)))
  2500. //(define-method ln ((n <number>)) (%ln (as <double-float> n)))
  2501.  
  2502. define method exp (n :: <number>)
  2503.     %exp(as(<double-float>, n));
  2504. end method;
  2505. define method ln (n :: <number>)
  2506.     %ln(as(<double-float>, n));
  2507. end method;
  2508.  
  2509. define method \^ (n1 :: <number>, n2 :: <number>)
  2510.     %pow(as(<double-float>, n1), as(<double-float>, n2));
  2511. end method;
  2512.  
  2513. // end number.dyl
  2514.  
  2515. //
  2516. // characters
  2517. //
  2518.  
  2519. //
  2520. // character.dyl
  2521. //
  2522. // Brent Benson
  2523. //
  2524.  
  2525. //(define-method as ((ic (singleton <integer>)) (ch <character>))
  2526. //  (%character->integer ch))
  2527.  
  2528. define method as (ic == <integer>, ch :: <character>)
  2529.     %character->integer(ch);
  2530. end;
  2531.  
  2532. //(define-method as ((cc (singleton <character>)) (i <integer>))
  2533. //  (%integer->character i))
  2534.  
  2535. define method as (cc == <character>, i :: <integer>)
  2536.     %integer->character(i);
  2537. end;
  2538.  
  2539. // comparisons
  2540.  
  2541. //(define-method binary< ((c1 <character>) (c2 <character>))
  2542. //  (binary< (as <integer> c1) (as <integer> c2)))
  2543.  
  2544. define method \< (c1 :: <character>, c2 :: <character>)
  2545.     as(<integer>, c1) < as(<integer>, c2);
  2546. end method;
  2547.  
  2548. // functionals
  2549.  
  2550. //(define-method compose ((function <function>)
  2551. //            #rest more-functions)
  2552. //  (if (empty? more-functions)
  2553. //      function
  2554. //      (method ( #rest args)
  2555. //          (function (apply (apply compose (car more-functions)
  2556. //                      (cdr more-functions))                    
  2557. //                   args)))))
  2558.  
  2559. define method compose(function :: <function>, #rest more-functions)
  2560.     if (empty?(more-functions))
  2561.         function;
  2562.     else
  2563.         method (#rest args)
  2564.             function(apply(apply(compose, head(more-functions), tail(more-functions)), args));
  2565.         end;
  2566.     end;
  2567. end method;
  2568.  
  2569. //(define-method complement ((function <function>))
  2570. //  (method (#rest args) (not (apply function args))))
  2571. define method complement (f :: <function>)
  2572.     method (#rest args)
  2573.         ~(apply(func, args));
  2574.     end;
  2575. end method;
  2576.  
  2577. //(define-method disjoin ((function <function>) #rest functions)
  2578. //;
  2579. //; Not very efficient, but works --  jnw
  2580. //;
  2581. //  (method (#rest args)
  2582. //      (if (empty? functions)
  2583. //          (apply function args)
  2584. //          (or (apply function args)
  2585. //          (apply (apply disjoin functions) args)))))
  2586.  
  2587. define method disjoin (func :: <function>, #rest functions)
  2588.     method (#rest args)
  2589.         let disjunction = %apply(func, args);
  2590.         let fns = functions;
  2591.         while ((~disjunction) & (fns ~= #()))
  2592.             disjunction := %apply(head(fns), args);
  2593.             fns := tail(fns);
  2594.         end while;
  2595.         disjunction;
  2596.     end;
  2597. end method;
  2598.  
  2599. //(define-method conjoin ((function <function>) #rest functions)
  2600. //; Not very efficient, but works -- jnw
  2601. //  (method (#rest args)
  2602. //      (if (empty? functions)
  2603. //          (apply function args)
  2604. //          (and (apply function args)
  2605. //           (apply (apply conjoin functions) args)))))
  2606.  
  2607. //(define-method curry ((f <function>)
  2608. //              #rest curried-args)
  2609. //  (method (#rest regular-args)
  2610. //      (apply f (concatenate curried-args regular-args))))
  2611.  
  2612. //(define-method rcurry ((f <function>)
  2613. //              #rest curried-args)
  2614. //  (method (#rest regular-args)
  2615. //      (apply f (concatenate regular-args curried-args))))
  2616.  
  2617. //(define-method always ((obj <object>))
  2618. //  (method (#rest args) obj))
  2619.  
  2620. // eof
  2621. // princ("at eof.");
  2622.